从逻辑回归开始入门深度学习
本文主要来源于吴恩达《深度学习与神经网络》。本文根据课程内容做一个串联。
本文内容安排如下:
- 符号定义
- 逻辑回归LR:定义、实现、高效实现
- 浅层神经网络(2层):实现、优化
- 深度神经网络:实现、优化、应用
我们以一个分类问题作为研究背景。研究问题为判断输入图片是否为猫咪的二分类。
符号定义
在解决问题之前,我们先对使用的数学符号做一个定义:
- (x, y): 输入样本; x ∈ R n x R^{n_x} Rnx, y ∈ {0, 1}
- { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) . . . ( x ( m ) , y ( m ) ) (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)})... (x^{(m)}, y^{(m)}) (x(1),y(1)),(x(2),y(2))...(x(m),y(m))}: 训练数据集,包含m个训练样本
- [a,b,c,…,z].T: 向量,默认情况下,向量指的是列向量
- m = m t r a i n m = m_{train} m=mtrain, m t e s t m_{test} mtest=#test examples
- $X \in R^{n_x * m} : 训 练 集 , 训 练 样 本 以 ∗ ∗ 列 的 方 式 ∗ ∗ 进 行 堆 叠 , 换 言 之 , X 矩 阵 的 每 一 列 是 一 个 样 本 , 而 不 是 行 ; X . s h a p e = ( : 训练集,训练样本以**列的方式**进行堆叠,换言之,X矩阵的每一列是一个样本,而不是行; X.shape = ( :训练集,训练样本以∗∗列的方式∗∗进行堆叠,换言之,X矩阵的每一列是一个样本,而不是行;X.shape=(n_x$, m)
- Y ∈ R 1 ∗ m Y \in R^{1*m} Y∈R1∗m: 训练标签,标签以列的方式进行堆叠, Y . s h a p e = ( 1 , m ) Y.shape = (1,m) Y.shape=(1,m)
逻辑回归
在介绍逻辑回顾处理图片分类。我们处理的问题是二分类,输入一张图片判断图片中是否有猫。输入图片格式为RGB三色图,像素取值为0~255。
原理介绍
逻辑回归用于处理二分类问题。逻辑回归中 h ^ = P ( y = 1 ∣ x ) \hat{h} = P(y=1|x) h^=P(y=1∣x)用于计算输入样本为1的概率。以单个样本为例,其计算公式为
y ^ = s i g m o i d ( w T x + b ) \hat{y} = sigmoid(w^Tx+b) y^=sigmoid(wTx+b)
其中, x ∈ R n x x \in R^{n_x} x∈Rnx, w ∈ R n x w \in R^{n_x} w∈Rnx , b ∈ R b \in R b∈R。输出结果的取值范围为[0, 1]。
逻辑回归其实是线性回归的进一步加工,线性回归计算结果的取值范围为 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞),我们将线性回归的计算结果使用sigmoid将范围压缩到[0, 1].
Sigmoid是一种非线性的S型函数,取值范围在[0, 1],这种输出值可以别理解为概率表示。Sigmoid函数的计算公式和曲线如下。
S i g m o i d ( z ) = 1 1 + e − z Sigmoid(z) = \frac{1}{1+e^{-z}} Sigmoid(z)=1+e−z1
从上图可以看出,sigmoid取值范围为[0, 1],当自变量z非常小时,sigmoid趋近于0;当z非常大时,sigmoid趋近于1(实际上当z=10时,输出值为0.9999,非常趋近于1)。
Loss function
我们现在知道了如何使用逻辑回归计算一个样本为正例的概率,那么如何评估模型的好坏呢?这就依赖于损失函数。
给定一个样本 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i)),使用逻辑回归计算这个样本为正例的概率P(y=1|x),
y ^ ( i ) = σ ( w T x ( i ) + b ) , w h e r e σ ( z ) = 1 1 + e − z \hat{y}^{(i)} = \sigma(w^Tx^{(i)} + b), where \ \sigma(z)=\frac{1}{1+e^{-z}} y^(i)=σ(wTx(i)+b),where σ(z)=1+e−z1
理想情况下,输出结果 y ^ \hat y y^应该和样本标签y尽可能相等,即 y ^ ( i ) ≈ y ( i ) \hat y^{(i)} \approx y^{(i)} y^(i)≈y(i)
L ( y ^ , y ) = − ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ) L(\hat y, y) = -(ylog\hat y + (1-y)log(1-\hat y)) L(y^,y)=−(ylogy^+(1−y)log(1−y^))
当y=1时, L ( y ^ , y ) = − l o g y ^ L(\hat y, y)=-log\hat y L(y^,y)=−logy^;当y=0时, L ( y ^ , y ) = − l o g ( 1 − y ^ ) L(\hat y, y) = -log(1-\hat y) L(y^,y)=−log(1−y^).
在全部训练样本上,损失函数cost function为
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ) = − 1 m ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] J(w, b) = \frac1{m}\sum_{i=1}^m L(\hat y, y) = -\frac1{m}\sum_{i=1}^m[y^{(i)}log\hat y^{(i)} + (1-y^{(i)})log(1-\hat y^{(i)})] J(w,b)=m1i=1∑mL(y^,y)=−m1i=1∑m[y(i)logy^(i)+(1−y(i))log(1−y^(i))]
损失函数是参数w,b的函数,我们想要通过最小化损失函数找到最佳的参数w,b,最后用于样本的预测[通过最小化损失函数,我们可以保证预测结果与真实样本标签之间差距尽可能小,进而保证预测结果的准确性]。
LR损失函数可以使用最大似然估计来进行推导。
Gradient Descent
知道了模型的损失函数,接下来就是通过最小化损失函数得到最终的参数w,b。常用的方法是使用梯度下降法,使用当前位置的偏导数对参数进行更新,反复多次后,损失函数到达最低点,此时w,b即为最终结果。
使用梯度下降算法,w,b的更新公式如下:
w = w − α ∂ J ( w , b ) ∂ w b = b − α ∂ J ( w , b ) ∂ b w = w - \alpha \frac{\partial J(w, b)}{\partial w} \\b = b - \alpha \frac{\partial J(w, b)}{\partial b} w=w−α∂w∂J(w,b)b=b−α∂b∂J(w,b)
其中, α \alpha α为学习率,含义是每次参数更新的步幅;如果 α \alpha α过大,导致参数更新幅度过大,可能会错过模型的最优值;如果 α \alpha α过下,导致每次更新幅度很小,模型需要更多的迭代次数才能收敛。在程序代码中,我们使用dw表示 ∂ J ( w , b ) ∂ w \frac{\partial J(w, b)}{\partial w} ∂w∂J(w,b), db表示 ∂ J ( w , b ) ∂ b \frac{\partial J(w, b)}{\partial b} ∂b