第二周:神经网络的编程基础(Basics of Neural Network programming)
1、逻辑回归的代价函数(Logistic Regression Cost Function)
逻辑回归需要注意的两个点是,sigmoid函数和log损失函数。
sigmoid函数的函数表达式为
作为线性函数后的非线性转化,使得逻辑回归有别于硬分类的算法,例如SVM。逻辑回归对于分类的输出结果是[0,1]之间的一个值。
逻辑回归使用的损失函数(用于更新梯度)是 log损失函数,具体公式如下
y^和y分别代表预测值和真实值。
对于log损失函数的解释,可以如下考虑:
当y=1时损失函数L= - log(y^),如果想要损失函数 L 尽可能得小,那么 y^ 就要尽可能大,因为sigmoid函数取值[0,1],所以 y^ 会无限接近于1。
当y=0时损失函数L = - log(1-y^),如果想要损失函数 L 尽可能得小,那么 y^ 就要尽可能小,因为sigmoid函数取值[0,1],所以 y^ 会无限接近于0。
2、使用计算图求导数(Derivatives with a Computation Graph)
通过计算图的形式理解前向传播和反向传播。
前向(正向)传播:
假设,我们需要去求解 J(a,b,c)=3(a+b*c),我们将它拆成 几个步骤,则如下图所示
1、计算 u = b*c = 3 * 2 = 6
2、计算 v = a + u = 5 + 6 = 11
3、计算 J = 3 * v = 3 * 11 = 33
在这后面再加上,激活函数的转化,误差的计算就是完整的前向传播过程了。
反向传播:
所谓的反向传播,就是假设我们已经进行过了一次前向传播的过程,也就是得到了预测值与实际值之间的误差,
我们想通过这个误差来调整输入的值(a,b,c),使得他们在前向计算得到的预测值能够更加的接近实际值。
1、计算 dJ / dv = 3
2、计算 dv / da = 1以及 dv / du = 1
3、计算 du / db = c = 2 , du / dc = b = 3
至此,我们计算了图中所有可见项的导数,那么我们需要计算的 dJ / da,dJ / db,dJ / dc就可以通过链式求导法则得到。
4、dJ / da = (dJ / dv) * (dv / da) = 3 * 1 = 3 ; dJ / db = (dJ / dv) * (dv / du) * (du / db) = 3 * 1 * 2 = 2;
dJ / dc = (dJ / dv) * (dv / du) * (du / dc) = 3 * 1 * 3 = 3。
即如下图的过程。
在第二周,吴恩达首先介绍了逻辑回归算法(以及其损失函数),将逻辑回归算法看成一个神经网络,介绍了梯度下降和计算图,利用计算图更直观的介绍了反向传播的原理以及实现。
参考文献:
[1]. 课程视频:Coursera-deeplearning.ai / 网易云课堂
[2]. 深度学习笔记