之前由于个人懒惰的发了篇极差的文章,现在更正错误,发一篇正在学习tensorflow的笔记
在构建神经网络过程中,为了刻画神经网络模型的效果以及优化目标,需要使用到损失函数(loss function)
所谓损失函数使用来估计模型预测值与实际值的不一样程度,是一个绝对值,损失函数越小,模型的拟合度越好。
在之前的机械学习过程中,学过代价函数(cost function),在了解过后其实两者并没有差别。
首先讲解分类问题和回归问题使用到的经典损失函数,利用之前学习到的知识。
通俗来讲就是简单的将问题的分为两类答案(是/不是),但是当你应用于多类别虽有理论可行的阈值分类办法,但无法应用。
通过神经网络多输出节点,其中n为类别的个数,如果样本属于k类,那么对应节点输出值即为1,输出结果越接近该矩阵,损失函数的拟合性越好,而判定的标准则是交叉熵(cross entropy),刻画两个概率之间的距离。q来表示p的交叉熵: H ( p , q ) = − [ ∑ x p ( x ) l o g q ( x ) ] H(p,q) = -[\displaystyle \sum_{x}p(x)logq(x)] H(p,q)=−[x∑p(x)logq(x)] 交叉熵是刻画两个概率的距离,而神经网络输出的类别。概率分布刻画不同事件发生概率。满足:
任意事件发生的概率都在0和1之间,且总有某一事件发生(概率的和为1),即非负即正。
softmax回归作为优化分类结果,Tensorflow中进行参数优化,在神经网络中当作原始输出层与最终输出层之间的隐藏层。
输出为: s o f t m a x ( y ) i = y i ′ = e y i / [ ∑ j = 1 n e y i ] softmax(y)_i = y_i' = e^{y_i}/ [\displaystyle \sum_{j=1}^n e^{y^i}] softmax(y)i=yi′=eyi/[j=1∑neyi] 作用神经网络推导,一个样例为不同类型的概率分别多大。即输出也为概论分布,从而通过交叉熵计算差距。
tensorflow代码实现
cross_entropy = -tf.reduce_mean( y_ * tf.log(tf.clip_by_value(y, 1e-10,1.0))) #y_正确结果,y预测结果,tf.clip_by_value将张量限制,避免运算错误 #tf.clip_by_value例子 v = tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]]) print(tf.clip_by_value(v,2.5,4.5).eval()) #取值范围,大于4.5取4.5,小于2.5取2.5,输出[[2.5,2.5,3.0][4.0,4.5,4.5]] #tf.log对张量中所有元素求对数 v = tf.constant([1.0,2.0,3.0]) print(tf.log(v).eval()) #输出[0,0.69314,1.09861] #矩阵乘法tf.matmul函数 v1= tf.constant([1.0,2.0][3.0,4.0]) v2 = tf.constant([5.0,6.0][7.0,8.0]) print(v1*v2).eval() #元素相乘 print(tf.matmul(v1,v2).eval()) #求平均交叉熵(因类别种类不变,整个矩阵作平均并不改变计算结果) v = tf.constant([[1.0,2.0,3.0][4.0,5.0,6.0]]) print(tf.reduce_mean(v).eval()) #tensorflow为方便两者联合使用,进行封装 cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels = y_,logits = y) #y为原始结果 y_为标准结果,一次满足两个要求回归方程的使用对象则是类似房价预测,这种无法提前分类的问题,而是具体数值。
在机械学习中,代价函数中逻辑回归方程
Logistic regression:
J ( Θ ) = − 1 / m [ ∑ i = 1 m y ( i ) log h Θ ( x ( i ) ) + ( 1 − y ( i ) log ( 1 − h Θ ( x ( i ) ) ] + λ / m ∑ j = 1 m Θ j 2 J{(\Theta)} = -1/m [ \displaystyle \sum^{m}_{i=1}y^{(i)} \log h_{\Theta}(x^{(i)}) + (1 - y^{(i)}\log(1-h_{}\Theta (x^{(i)})] +\lambda/m\displaystyle \sum^{m}_{j=1}\Theta_j^2 J(Θ)=−1/m[i=1∑my(i)loghΘ(x(i))+(1−y(i)log(1−hΘ(x(i))]+λ/mj=1∑mΘj2
加入额外正则化而在深度学习中,均方误差(MSN,mean squared error) M S N ( y , y ′ ) = [ ∑ ( y i − y i ′ ) 2 ] / n MSN(y,y')=[\displaystyle \sum(y_i-y_i')^2]/n MSN(y,y′)=[∑(yi−yi′)2]/n yi为batch中第ℹ个数据,而yi’则是预测值
mse = tf.reduce_mean(tf.square(y_-y))例如在成本运算中,成本与利润之间的平衡,利用经典的均方误差损失函数无法满足计算要求,为此通过优化算法自定损失函数实现利益最大化,满足计算要求。例如单件成本小于利润, L O S S ( y , y ′ ) = ∑ f ( y i , y i ′ ) ; f ( x , y ) = a ( x − y ) x > y ; f ( x , y ) = b ( y − x ) x < y ; LOSS(y,y')=\displaystyle \sum f(y_i,y_i'); f(x,y)=a(x-y) x>y; f(x,y)=b(y-x) x<y; LOSS(y,y′)=∑f(yi,yi′);f(x,y)=a(x−y)x>y;f(x,y)=b(y−x)x<y; 在营销问题中,a=10(多于),b=1(少于)。通过tensorflow,实现该损失函数
loss = tf.reduce_sum(tf.where(tf.greater(v1,v2),(v1-v2)*a,(v2-v1)*b)) #tf.greater的输入是两个张量,比较每一个元素的大小,返回结果 #tf.where判断并选择输出 import tensorflow as tf v1 = tf.constant([1.0,2.0,3.0,4.0]) v2 = tf.constant([4.0,3.0,2.0,1.0]) sess = tf.InteractiveSession() print(tf.greater(v1,v2).eval()) #返回[False,False,True,True] print(tf.where(tf.greater(v1,v2),v1,v2).eval()) #返回[4,3,3,4] sess.close()#结束会话w1=[1.01934695,1.04280889],即预测函数为1.02x1+1.04x2
如果loss_less = 1,loss_more = 10,则为0.95X1+0.98X2,预测则会偏少。
如果使用MSN,则为0.97X1+1.02X2,距离标准数值越接近。
(p.s.注意这里计算出的交叉熵)
通过,比对三个例子的自定义损失函数、MSN感受不同损失函数会对训练神经网络效果的刻画不同。