深度学习——损失函数

mac2022-10-05  64

深度学习——损失函数

之前由于个人懒惰的发了篇极差的文章,现在更正错误,发一篇正在学习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)=[xp(x)logq(x)] 交叉熵是刻画两个概率的距离,而神经网络输出的类别。概率分布刻画不同事件发生概率。满足:

任意事件发生的概率都在0和1之间,且总有某一事件发生(概率的和为1),即非负即正。

如何在前向传播过程中的概率分布:softmax回归

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=1neyi] 作用神经网络推导,一个样例为不同类型的概率分别多大。即输出也为概论分布,从而通过交叉熵计算差距。

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=1my(i)loghΘ(x(i))+(1y(i)log(1hΘ(x(i))]+λ/mj=1mΘ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)=[(yiyi)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; LOSSy,y=f(yi,yi);f(x,y)=a(xy)x>y;f(x,y)=b(yx)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()#结束会话

总结

import tensorflow as tf from numpy.random import RandomState batch_size = 8 #两个输入节点 x = tf.placeholder(tf.float32, shape=(None,2),name = 'x-input') y_ = tf.placeholder(tf.float32, shape=None,1),name ='y-input') #定义一个单层神经网络的前向传播过程,简单加权和 w1 = tf.Variable(tf.random_normal([2,1],stddev=1,seed=1)) y = tf.matmul(x,w1) #定义预测多了和预测少了的成本 loss_less = 10 #少赚10 loss_more = 1 #亏了1 loss = tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*loss_more,(y_-y)*loss_less)) train_step = tf.train.AdamOptimizer(0.001).minimize(loss) #随即生成模拟数据集 rdm = RandomState(1) dataset_size = 128 X = rdm.rand(dataset_size,2) #设置回归的正确数值的输入和加上随机量,避免不可预测的噪音,否则不同损失函数的比较没有意义,因为不同损失函数都会在完全预测正确的时候最低。一般噪声均值为0的小量。所以设置为-0.05~0.05 Y = [[x1+x2+rdm.rand()/10.0-0.05]for (x1,x2) in x] #训练神经网络 with tf.Session() as sess: init_op = tf.global_variable_initializer() sess.run(init_op) STEEPS = 5000 for i in range(STEEPS): start = (i*batch_size)%dataset_size end = min(start + batch_size,dataset_size) sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]}) print(sess.run(w1))

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感受不同损失函数会对训练神经网络效果的刻画不同。

最新回复(0)