原文链接: COURSERA:逻辑回归和梯度下降.
COURSERA:逻辑回归和梯度下降
logistic regression相当于是神经网络中的一个神经元,在记录之前先约定一些符号
x
(
i
)
指
第
i
个
样
本
本
x^{(i)}指第i个样本本
x(i)指第i个样本本
x j ( i ) 指 第 i 个 样 本 的 第 j 个 特 征 值 x_j^{(i)}指第i个样本的第j个特征值 xj(i)指第i个样本的第j个特征值
z ( i ) 指 的 是 第 i 个 样 本 经 过 线 性 变 换 后 的 特 征 向 量 z^{(i)}指的是第i个样本经过线性变换后的特征向量 z(i)指的是第i个样本经过线性变换后的特征向量
a ( i ) 指 的 是 第 i 个 样 本 经 过 激 活 函 数 后 的 值 a^{(i)}指的是第i个样本经过激活函数后的值 a(i)指的是第i个样本经过激活函数后的值
整个算法的结构如下图所示:
假如我们的训练向量是一幅图,首先将三维RGB(或者其他格式)展开为一维列向量,记为
X
(
i
)
X^{(i)}
X(i),经过标准化处理将数据缩放到[0,1]的范围内,对于每一个
x
(
i
)
x^{(i)}
x(i):
z
(
i
)
=
w
T
x
(
i
)
+
b
(1)
z^{(i)} = w^T x^{(i)} + b \tag{1}
z(i)=wTx(i)+b(1)
y ^ ( i ) = a ( i ) = s i g m o i d ( z ( i ) ) (2) \hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)})\tag{2} y^(i)=a(i)=sigmoid(z(i))(2)
L ( a ( i ) , y ( i ) ) = − y ( i ) log ( a ( i ) ) − ( 1 − y ( i ) ) log ( 1 − a ( i ) ) (3) \mathcal{L}(a^{(i)}, y^{(i)}) = - y^{(i)} \log(a^{(i)}) - (1-y^{(i)} ) \log(1-a^{(i)})\tag{3} L(a(i),y(i))=−y(i)log(a(i))−(1−y(i))log(1−a(i))(3)
L ( a ( i ) , y ( i ) ) \mathcal{L}(a^{(i)}, y^{(i)}) L(a(i),y(i))是损失函数,直观的来看这个函数,举例:
-
–当模型比较好时,当正确结果为正例时, y ( i ) y^{(i)} y(i)为1,此时 ( 1 − y ( i ) ) log ( 1 − a ( i ) ) (1-y^{(i)} ) \log(1-a^{(i)}) (1−y(i))log(1−a(i))是0, a ( i ) a^{(i)} a(i)会很接近1, − y ( i ) log ( a ( i ) ) - y^{(i)} \log(a^{(i)}) −y(i)log(a(i))就接近0, L \mathcal{L} L就小。负例同理。
-
–当模型比较差时,当正确结果为正例时, y ( i ) y^{(i)} y(i)为1,此时 ( 1 − y ( i ) ) log ( 1 − a ( i ) ) (1-y^{(i)} ) \log(1-a^{(i)}) (1−y(i))log(1−a(i))是0, a ( i ) a^{(i)} a(i)会比1小很多, − y ( i ) log ( a ( i ) ) - y^{(i)} \log(a^{(i)}) −y(i)log(a(i))的值就会比较大, L \mathcal{L} L就小。负例同理。
梯度下降
在对所有的训练样例都进行了一次上述公式1-3的过程后(称之为1个echo),就需要对权值 w w w和偏倚 b b b进行优化,优化的依据就是最小化损失函数。
对所有的训练样例,损失函数:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
a
(
i
)
,
y
(
i
)
)
(4)
J(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)})\tag{4}
J(w,b)=m1i=1∑mL(a(i),y(i))(4)
梯度下降的具体步骤为:
1.计算损失函数对所有参数的导数,计算出梯度 (需要下降多少)
2.在原来的基础上减去梯度
符号说明:
d
w
:
J
对
w
的
梯
度
dw:J对w的梯度
dw:J对w的梯度
d b : J 对 b 的 梯 度 db:J对b的梯度 db:J对b的梯度
具体做法(单个样本):
z
=
w
1
x
1
+
w
2
x
2
+
b
→
a
=
σ
(
z
)
→
L
=
−
y
log
(
a
)
−
(
1
−
y
)
log
(
1
−
a
)
z = w_1x_1+w_2x_2 + b \quad → \quad a=σ(z) \quad → \quad \mathcal{L} = - y \log(a )- (1-y ) \log(1-a)
z=w1x1+w2x2+b→a=σ(z)→L=−ylog(a)−(1−y)log(1−a)
那么
d
L
d
a
=
−
y
a
+
1
−
y
1
−
a
\frac{d\mathcal{L}}{da}=-\frac{y}{a}+\frac{1-y}{1-a}
dadL=−ay+1−a1−y
∂ L ∂ z = d L d a d a d z = a − y \frac{\partial \mathcal{L}}{\partial z} = \frac{d\mathcal{L}}{da}\frac{da}{dz}=a-y ∂z∂L=dadLdzda=a−y
由于:
∂
L
∂
w
1
=
∂
L
∂
z
∂
z
∂
w
1
=
∂
L
∂
z
∗
x
1
=
(
a
−
y
)
∗
x
1
\frac{\partial \mathcal{L}}{\partial w1} = \frac{\partial \mathcal{L}}{\partial z}\frac{\partial z}{\partial w1}=\frac{\partial \mathcal{L}}{\partial z}*x_1=(a-y)*x_1
∂w1∂L=∂z∂L∂w1∂z=∂z∂L∗x1=(a−y)∗x1
∂ L ∂ w 2 = ∂ L ∂ z ∂ z ∂ w 2 = ∂ L ∂ z ∗ x 2 = ( a − y ) ∗ x 2 \frac{\partial \mathcal{L}}{\partial w2} = \frac{\partial \mathcal{L}}{\partial z}\frac{\partial z}{\partial w2}=\frac{\partial \mathcal{L}}{\partial z}*x_2=(a-y)*x_2 ∂w2∂L=∂z∂L∂w2∂z=∂z∂L∗x2=(a−y)∗x2
那么:
∂
L
∂
w
=
∂
L
∂
z
∂
z
∂
w
=
∂
L
∂
z
∗
x
=
x
(
a
−
y
)
\frac{\partial \mathcal{L}}{\partial w} = \frac{\partial \mathcal{L}}{\partial z}\frac{\partial z}{\partial w}=\frac{\partial \mathcal{L}}{\partial z}*x=x(a-y)
∂w∂L=∂z∂L∂w∂z=∂z∂L∗x=x(a−y)
∂
L
∂
b
=
∂
L
∂
z
∂
z
∂
b
=
∂
L
∂
z
∗
1
=
a
−
y
\frac{\partial \mathcal{L}}{\partial b} = \frac{\partial \mathcal{L}}{\partial z}\frac{\partial z}{\partial b}=\frac{\partial \mathcal{L}}{\partial z}*1= a-y
∂b∂L=∂z∂L∂b∂z=∂z∂L∗1=a−y
对于
m
m
m个样本:
将
m
m
m个样本的
L
\mathcal{L}
L、
d
L
d
w
\frac{d\mathcal{L}}{dw}
dwdL和
d
L
d
b
\frac{d\mathcal{L}}{db}
dbdL叠加得到
J
J
J、
d
J
d
w
\frac{dJ}{dw}
dwdJ和
d
J
d
b
\frac{dJ}{db}
dbdJ:
J
=
1
m
J
\mathcal{J} = \frac{1}{m} J
J=m1J
∂ J ∂ w = 1 m ∂ J ∂ w \frac{\partial \mathcal{J}}{\partial w} = \frac{1}{m} \frac{\partial J}{\partial w} ∂w∂J=m1∂w∂J
∂ J ∂ b = 1 m ∂ J ∂ b \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \frac{\partial J}{\partial b} ∂b∂J=m1∂b∂J
最后进行权值更新:
w
=
w
−
α
∂
J
∂
w
(5)
w = w - α\frac{\partial \mathcal{J}}{\partial w} \tag{5}
w=w−α∂w∂J(5)
b = b − α ∂ J ∂ b (6) b = b - α\frac{\partial \mathcal{J}}{\partial b} \tag{6} b=b−α∂b∂J(6)
将计算向量化
在上面的过程中,我们注意到对于多个训练样例,一个echo就会有多个循环:
for sample in samples: #对每个样本遍历
for i in sample: #对样本每个参数
for循环所花费的时间是比矩阵运算多很多,所以要运用python的广播机制和numpy运算将for循环转换为矩阵运算。
转换过程的最关键的点就是横向量和列向量的转换,要把对的元素对应起来,现在来规范一下向量格式。
训练数据
X
n
_
y
∗
m
X_{n\__y*m}
Xn_y∗m:
KaTeX parse error: Undefined control sequence: \ at position 35: …trix} .&.&.&.\\\̲ ̲.&.&.&.\\\ x^{(…
权重
w
w
w:
w
=
[
w
1
w
2
.
.
.
w
n
_
y
]
w=\left[ \begin{matrix}w_1\\w_2\\...\\w_{n\__y} \end{matrix}\right]
w=⎣⎢⎢⎡w1w2...wn_y⎦⎥⎥⎤
b = [ b ] 广 播 后 b = [ b 1 , b 2 , . . . b m ] b=\left[ b \right]广播后b=\left[ b_1,b_2,...b_m \right] b=[b]广播后b=[b1,b2,...bm]
那么:
A
=
σ
(
w
T
X
+
b
)
=
[
a
(
1
)
,
a
(
2
)
,
.
.
.
,
a
(
m
)
]
A=σ(w^TX+b)=\left[ a^{(1)},a^{(2)},...,a^{(m)} \right]
A=σ(wTX+b)=[a(1),a(2),...,a(m)]
最后的梯度:
∂
J
∂
w
=
1
m
X
(
A
−
Y
)
T
(7)
\frac{\partial \mathcal{J}}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{7}
∂w∂J=m1X(A−Y)T(7)
∂ J ∂ b = 1 m ∑ i = 1 m ( a ( i ) − y ( i ) ) (8) \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\tag{8} ∂b∂J=m1i=1∑m(a(i)−y(i))(8)
最后按照公式5、6进行权值更新。
{J}}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{7}
$$
∂ J ∂ b = 1 m ∑ i = 1 m ( a ( i ) − y ( i ) ) (8) \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\tag{8} ∂b∂J=m1i=1∑m(a(i)−y(i))(8)
最后按照公式5、6进行权值更新。