1.逻辑回归(logistic regression)
对于给定的一个x ,我们想要得到 y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1∣x) ,其中, x ∈ R n x x\in R^{n_{x}} x∈Rnx, 0 ≤ y ^ ≤ 1 0\leq \hat{y}\leq 1 0≤y^≤1
1.1损失函数
对于
y
^
(
i
)
=
s
i
g
m
o
i
d
(
W
T
+
b
)
\hat{y}^{(i)}=sigmoid(W^{T}+b)
y^(i)=sigmoid(WT+b),我们想要得到
y
^
(
i
)
≈
y
(
i
)
\hat{y}^{(i)}\approx y^{(i)}
y^(i)≈y(i),因此定义损失函数
L
(
y
^
,
y
)
=
−
y
log
(
y
^
)
−
(
1
−
y
)
log
(
1
−
y
^
)
L(\hat{y},y)=-y\log(\hat{y})-(1-y)\log(1-\hat{y})
L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
原理:
i
f
y
=
1
,
L
(
y
^
,
y
)
=
−
y
log
(
y
^
)
,
此
时
L
↓
,
log
(
y
^
)
↑
,
所
以
y
↑
if\ y =1,\ L(\hat{y},y)=-y\log(\hat{y}),\ 此时L\downarrow,\ \ \log(\hat{y})\uparrow,所以y\uparrow
if y=1, L(y^,y)=−ylog(y^), 此时L↓, log(y^)↑,所以y↑
i f y = 0 , L ( y ^ , y ) = − ( 1 − y ) log ( 1 − y ^ ) , 此 时 L ↓ , log ( y ^ ) ↑ , 所 以 y ↓ if\ y =0,\ L(\hat{y},y)=-(1-y)\log(1-\hat{y}),\ 此时L\downarrow,\ \ \log(\hat{y})\uparrow,所以y\downarrow if y=0, L(y^,y)=−(1−y)log(1−y^), 此时L↓, log(y^)↑,所以y↓
代价函数:
J
(
W
,
b
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
y
(
i
)
^
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
(
i
)
^
)
]
J(W,b)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)} \log (\hat{y^{(i)}}) + (1-y^{(i)}) \log(1-\hat{y^{(i)}})]
J(W,b)=−m1i=1∑m[y(i)log(y(i)^)+(1−y(i))log(1−y(i)^)]
1.2梯度下降
正向传播原理如下:(以两个输入为例子)
(
x
1
,
x
2
,
w
1
,
w
2
,
b
)
⟶
Z
=
w
1
x
1
+
w
2
x
2
+
b
⟶
a
=
σ
(
Z
)
⟶
L
(
a
,
y
)
(x_1,x_2,w_1,w_2,b)\longrightarrow Z=w_1x_1+w_2x_2+b \longrightarrow a=\sigma(Z) \longrightarrow L(a,y)
(x1,x2,w1,w2,b)⟶Z=w1x1+w2x2+b⟶a=σ(Z)⟶L(a,y)
通过上式的的流程,我们通过所学过的链式法则,分别算出
d
a
=
d
L
d
a
=
−
y
a
+
1
−
y
1
−
a
da=\frac{dL}{da}=-\frac{y}{a}+\frac{1-y}{1-a}
da=dadL=−ay+1−a1−y
d z = d L d z = a − y dz=\frac{dL}{dz}=a-y dz=dzdL=a−y
d w 1 = d L d w 1 = d L d z ∗ d z d w 1 = x 1 d z dw_1=\frac{dL}{dw_1}=\frac{dL}{dz}*\frac{dz}{dw_1}=x_1dz dw1=dw1dL=dzdL∗dw1dz=x1dz
d w 2 = d L d w 2 = d L d z ∗ d z d w 2 = x 2 d z dw_2=\frac{dL}{dw_2}=\frac{dL}{dz}*\frac{dz}{dw_2}=x_2dz dw2=dw2dL=dzdL∗dw2dz=x2dz
d b = d z db=dz db=dz
以上式子就是进行一次反向传播之后得到的结果,此时需要更新参数:
w
:
=
w
−
α
d
w
w:=w-\alpha dw
w:=w−αdw
b : = w − α d b b:=w-\alpha db b:=w−αdb
1.3代码实现
for i in np.arange(num_iter):
# grads,cost = propagate(w, b, X, Y)
m = X.shape[1]
A = sigmoid(np.dot(w.T, X) + b)
dz = A - Y
dw = np.dot(X, dz.T) / m
db = np.sum(dz) / m
cost = -1 / m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
assert (dw.shape == w.shape)
assert (db.dtype == float)
w = w - learnint_rate * dw
b = b - learnint_rate * db
2.softmax
2.1原理
上面所讲述的逻辑回归主要是用于二分类问题,输出层只有一个输出。而对于多分类问题,列如识别手写数字,需要10个输出,因此输出层需要使用softmax激活函数。
Z [ L ] = W [ L ] a [ L − 1 ] + b [ L ] Z^{[L]}=W^{[L]}a^{[L-1]}+b^{[L]} Z[L]=W[L]a[L−1]+b[L]
a i [ L ] = e i [ L ] ∑ i = 1 C e z i [ L ] a_{i}^{[L]}=\frac{e_{i}^{[L]}}{\sum_{i=1}^{C}e^{z_{i}^{[L]}}} ai[L]=∑i=1Cezi[L]ei[L]
输出层满足
a
i
[
L
]
a_i^{[L]}
ai[L]满足:(C表示输出个数)
∑
i
=
1
C
a
i
[
L
]
=
1
\sum_{i=1}^Ca_i^{[L]}=1
i=1∑Cai[L]=1
所有的a_i^{[L]}维度为(C,1)
2.2损失函数
利用交叉熵误差的方法,由于标签数据是one-hot的形式,因此cost可以是下面的式子:
J
=
1
m
∑
i
=
1
m
(
−
log
(
y
^
)
)
J=\frac{1}{m} \sum_{i=1}^{m}(-\log(\hat{y}))
J=m1i=1∑m(−log(y^))
2.3梯度下降
与1.2的逻辑回归梯度下降差不多,因为只有输出层不同,一个是sigmoid或者relu等激活函数,一个是softmax激活函数,通过对链式法则的理解,我们只要知道输出层的dZ就可以跟着1.2的算法推导出其他的式子了。
d
z
=
d
L
d
a
=
a
−
y
dz=\frac{dL}{da}=a-y
dz=dadL=a−y
(高等数学微积分知识,草稿纸慢慢算吧,反正答案是这个)