深度学习损失函数
深度学习损失函数在利用深度学习模型解决有监督问题时,比如分类、回归、去噪等,我们一般的思路如下:1、信息流forward propagation,直到输出端;2、定义损失函数L(x, y | theta);3、误差信号back propagation。采用数学理论中的“链式法则”,求L(x, y | theta)关于参数theta的梯度;4、利用最优化方法(比如随机梯度下降法),进行参数更新;5、重复步骤3、4,直到收敛为止;在第2步中,我们通常会见到多种损失函数的定义方法,常见的有均方误差(error of mean square)、最大似然误差(maximum likelihood estimate)、最大后验概率(maximum posterior probability)、交叉熵损失函数(cross entropy loss),下面我们就来理清他们的区别和联系。一般地,一个机器学习模型选择哪种损失函数,是凭借经验而定的,没有什么特定的标准。具体来说, (1)均方误差是一种较早的损失函数定义方法,它衡量的是两个分布对应维度的差异性之和。说点题外话,与之非常接近的一种相似性度量标准“余弦角”,则衡量的是两个分布整体的相似性,也即把两个向量分别作为一个整体,计算出的夹角作为其相似性大小的判断依据,读者可以认真体会这两种相似性判断标准的差异; (2)最大似然误差是从概率的角度,求解出能完美拟合训练样例的模型参数theta,使得概率p(y | x, theta)最大化; (3)最大化后验概率,即使得概率p(theta | x, y)最大化,实际上也等价于带正则化项的最大似然概率(详细的数学推导可以参见Bishop 的Pattern Recognition And Machine Learning),它考虑了先验信息,通过对参数值的大小进行约束来防止“过拟合”; (4)交叉熵损失函数,衡量的是两个分布p、q的相似性。在给定集合上两个分布p和q的cross entropy定义如下: 其中,H(p)是p的熵,Dkl(p||q)表示KL-divergence。对于离散化的分布p和q, 在机器学习应用中,p一般表示样例的标签的真实分布,为确定值,故最小化交叉熵和最小化KL-devergence是等价的,只不过之间相差了一个常数。 值得一提的是,在分类问题中,交叉熵的本质就是似然函数的最大化。证明如下:记带标签的样例为(x, y), 其中x表示输入特征向量,y=[y1, y2, …, yc]表示真实标签的one-hot表示,y_=[y1, y2, …, yc]表示模型输出的分布,c表示样例输出的类别数,那么。 (1)对于二分类问题,p(x)=[1, 0],q(x)=[y1, y2],y1=p(y=1|x)表示模型输出的真实概率,交叉熵H(p, q)=-(1*y1+0*y2)=-y1,显然此时交叉熵的最小化等价于似然函数的最大化; (2)对于多分类问题, 假设p(x)=[0, 0, 0, …, 1, 0, 0],q(x)=[y1, y2, y3, …, yk, y(k+1), y(k+2)],即表示真实样例标签为第k类,yk=p(y=k|x)表示模型输出为第k类的概率,交叉熵H(p,q)=-(0*y1+0*y2+0*y3+…+1*yk+0*y(k+1)+0*y(k+2)) = -yk, 此时同上。
如何调用指针函数
1.如果是返回值是指针char* getname(){char* pname=new char; //返回指针必须是函数释放后并未释放的内存空间,cout《《“input your name:\n“; //一般返回两种情况,一是在函数中像该函数一样动态分配堆内存cin.getline(pname,22); //二是返回指针指向参数中地址,如: int* max(int a,int b) { return &a }pname=’\0’;return pname;}int main(){char* name=getname();cout《《“your name is: “《《name《《endl;delete name; //记得动态释放分配内存return 0;}2.参数是指针类型常见的是通过指针或引用交换两个数的值void swa(int* p1,int* p2){int temp=*p1; *p1=*p2; *p2=temp;}int main(){int a=2,b=3;swa(&a,&b); //传递地址return 0;}附解:你可以把指针看做是一种复合类型,它之所以可以修改参数值,本质是因为对指针解除引用*p形式是操作的参数所存数据内存空间,但如果它不解除引用,它并不会修改参数的值:如void swa(int* p1,int* p2) //函数意思是最初始在函数参数块中定义两个指针p1,p2,使{ //p1指向a,p2指向b,下面函数体只是使指针指向地址改变,成了//p1指向b,p2指向a。但并未对a,b内存空间操作,当函数调用结束后,指针p1,p2//也释放了,所以并未起任何作用int* temp;temp=p1; p1=p2; p2=temp;}int main(){int a=2,b=3;swa(&a,&b); //传递地址cout《《a《《“ “《《b;return 0;}这个函数并不会交换a,b的值
excel中计算相乘的函数
打开【Excel表格】,在结果栏输入【等于号】,选中要相乘的数值,输入乘法符号,再选择另一个数值,回车键即可得到乘积,选中结果单元格,移动到单元格右下角,当鼠标变成黑色十字时,按鼠标左键向下拖动,即可得到其他乘积。