简单来说,深度学习就是通过计算梯度、反向传播来不断改善网络内的参数,以此使得网络模型更加贴合目标数据。而梯度和loss值是分不开的,选择好合适的loss计算方法也是有助于训练好优秀的网络模型的。
常用的loss计算方法有两种,一个是均方差,另一个是交叉熵。均方差差不多是万金油,什么都可以套一套,通常与sigmoid激活函数搭配使用。交叉熵则更加适合分类问题,简单来说,交叉熵越低,事物发生的确定性越大。
下面简单介绍一下TensorFlow和PyTorch的损失计算的API。
均方差=∑(y-out)**2
其中out为计算值,也就是模型的计算结果。y为真实值,也就是数据集中的正确的结果。
loss=tensorflow.keras.losses.MSE(计算值,真实值)
loss=tensorflow.reduce_mean(loss)
loss=torch.nn.functional.mse_loss(计算值,真实值)
#PyTorch中默认会把loss值都加起来,所以比 TensorFlow少一行代码
交叉熵 H(p,q)=-∑p(x)·㏒₂q(x)
p和q分别为两个事件,p(x)和q(x)为两个事件发生的概率。
下面输入的计算值和真实值都需要进行one-hot处理.
TensorFlow中one-hot接口:one-hot=tensorflow.one_hot(输入值,depth=一共分了几类)
PyTorch中会自动进行one-hot处理
真实值=tensorflow.one-hot(真实值,depth=2/n)
#二分类时:
计算值=tensorflow.one-hot(计算值,depth=2)
loss=tensorflow.losses.binary_crossentropy(计算值,真实值)
#多分类时:
计算值=tensorflow.one-hot(计算值,depth=n)
loss=tensorflow.losses.categorical_crossentropy(计算值,真实值)
loss=torch.nn.functional.cross_entropy(计算值,真实值)
总的流程是loss->梯度->优化器。
计算出loss后进行梯度求导,如何传入优化器,由优化器来调整网络的参数。
#例:
with tensorflow.Gradient Tape() as tape:
out=model(x)
loss=tensorflow.keras.losses.MSE(y,out)
grad=tape.gradient(loss,model.trainable_variables)
optimizer.apply_gradients(zip(grad,model.trainable_variables))
#例:
out=model(x)
loss=torch.nn.function.mse_loss(out,y)
#貌似不需要这行??? grads=torch.autograd.grad(loss,model.paremeters())
optimizer.zero_grad()
loss.backward()
optimizer.step()
其中,model是网络模型,optimizer是优化器。