文章目录
- 神经网络编程基础
- 2.1 二分类(Binary Classification)
- 2.2逻辑回归(Logistic Regression)
- 2.3逻辑回归的代价函数(Cost Function of Logistic Regression)
- 2.4 梯度下降(Gradient Descent)
- 2.5 计算图(Computation Graph)
- 2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)
- 2.10 Logistic Regression on m examples代码流程
- 2.11向量化表达(Vectorization)
- 2.13向量化逻辑回归(Vectorizing Logistic Regression)
- 2.14 向量化Logistic回归的梯度(Vectorizing Logistic Regression's Gradient)
- 2.18 Logistic损失函数的来由(Explanation of Logistic Regression cost function)(待深入探究)
神经网络编程基础
2.1 二分类(Binary Classification)
假设有一张图片作为输入,1(cat) vs 0(not cat)
在计算机中保存一张图片需要RBG三种颜色的矩阵通道,如果图片像素为
64
∗
64
64*64
64∗64,那么总的向量
x
x
x的维度就是
n
x
=
64
∗
64
∗
3
=
12288
n_x=64*64*3=12288
nx=64∗64∗3=12288,这就是一张图片的输入
i
n
p
u
t
input
input,最后再预测是
0
o
r
1
0 or 1
0or1。
一些符号定义:
x
=
(
x
1
,
.
.
.
,
x
n
x
)
T
x = (x_1,...,x_{n_x})^T
x=(x1,...,xnx)T:表示一个
n
x
n_x
nx维数据,作为输入,即
n
x
n_x
nx维的一个列向量,
y
y
y:表示输出,取值是
(
0
,
1
)
(0,1)
(0,1),
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i)):表示第
i
i
i个input,
X
=
[
x
(
1
)
,
.
.
.
,
x
(
n
)
]
(
n
x
,
m
)
X = [x^{(1)},... , x^{(n)}]_{(n_x,m)}
X=[x(1),...,x(n)](nx,m):表示总的input数据,维度为
n
x
∗
m
n_x*m
nx∗m,
Y
=
[
y
(
1
)
,
.
.
.
,
y
(
n
)
]
(
1
,
m
)
Y = [y^{(1)},...,y^{(n)}]_{(1,m)}
Y=[y(1),...,y(n)](1,m):表示所有数据的
L
a
b
e
l
Label
Label,是一个
m
m
m维的行向量。
在python中可以用.shape()来查看某个矩阵的形状
x = [[1,4,6],[6,2,6],[5,5,4]]
x.shape()
2.2逻辑回归(Logistic Regression)
G
i
v
e
n
X
,
y
^
=
P
(
y
=
1
∣
x
)
,
0
≤
y
^
≤
1
Given X, \hat{y}= P (y=1|x),{0}\le{\hat{y}}\le{1}
GivenX,y^=P(y=1∣x),0≤y^≤1
x
∈
R
n
x
x \in \mathbb{R}^{n_x}
x∈Rnx
ω
∈
R
n
x
,
b
∈
R
.
\omega \in \mathbb{R}^{n_x} ,b \in \mathbb{R}.
ω∈Rnx,b∈R.
O
u
t
p
u
t
:
y
^
=
σ
(
ω
T
x
+
b
)
Output : \hat{y} = \sigma(\omega^{T}x + b)
Output:y^=σ(ωTx+b)
对于
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e−z1函数如果
Z
{Z}
Z越小,
σ
(
z
)
\sigma(z)
σ(z)就越接近0,
Z
{Z}
Z越大,
σ
(
z
)
\sigma(z)
σ(z)就越接近1.
其中,z定义为:
z
(
i
)
=
ω
T
x
(
i
)
+
b
z^{(i)}=\omega^{T}x^{(i)}+b
z(i)=ωTx(i)+b,上标
(
i
)
(i)
(i)表示input训练列向量的第
i
i
i个
2.3逻辑回归的代价函数(Cost Function of Logistic Regression)
y
^
(
i
)
=
σ
(
ω
T
x
(
i
)
+
b
)
,
σ
(
z
)
=
1
1
+
e
−
z
\hat{y}^{(i)}=\sigma(\omega^{T}x^{(i)}+b), {\sigma}(z)=\frac{1}{1+e{-z}}
y^(i)=σ(ωTx(i)+b),σ(z)=1+e−z1
我们希望模型的预测值接近目标实际值:
y
^
(
i
)
≈
y
(
i
)
\hat{y}^{(i)} \approx{y^{(i)}}
y^(i)≈y(i),由此引出损失函数
损失函数(误差函数):
可以用
y
^
(
i
)
\hat{y}^{(i)}
y^(i)与
y
(
i
)
y^{(i)}
y(i)之间的平方差或者绝对值,但是在逻辑回归中通常不用它们,因为在学习逻辑回归参数的时候,很多情况下优化目标不是凸优化的,可能有很多个局部的极值点,梯度下降算法很可能找不到全局最优解。
在逻辑回归中用到的损失函数为:
L
(
y
^
,
y
)
=
−
y
l
n
(
y
^
)
−
(
1
−
y
)
l
n
(
1
−
y
^
)
L(\hat{y},y)=-yln(\hat{y})-(1-y)ln(1-\hat{y})
L(y^,y)=−yln(y^)−(1−y)ln(1−y^)
- 当
y
=
1
y=1
y=1时,损失函数
L
=
−
l
n
(
y
^
)
L=-ln(\hat{y})
L=−ln(y^).
如果希望 L L L尽可能小,那么 y ^ \hat{y} y^就要尽可能大,又 y ^ \hat y y^的取值为 [ 0 , 1 ] [0,1] [0,1],那么 y ^ \hat y y^就需要尽可能接近 1 1 1. - 当
y
=
0
y=0
y=0时,损失函数
L
=
−
l
n
(
1
−
y
^
)
L =-ln(1-\hat y)
L=−ln(1−y^)
如果希望 L L L尽可能小,那么 y ^ \hat{y} y^就要尽可能小,又 y ^ \hat y y^的取值为 [ 0 , 1 ] [0,1] [0,1],那么 y ^ \hat y y^就需要尽可能接近 0 0 0.
那么当我们有
m
m
m个个体的数据,就需要对
m
m
m个损失函数求和然后除以
m
m
m:
J
(
ω
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
=
1
m
∑
i
=
1
m
(
−
y
(
i
)
l
n
(
y
^
(
i
)
)
−
(
1
−
y
(
i
)
)
l
n
(
1
−
y
^
(
i
)
)
)
J(\omega,b)=\frac{1}{m}\sum^{m}_{i=1}L(\hat{y}^{(i)},y^{(i)})=\frac{1}{m} \sum^{m}_{i=1}(-y^{(i)}ln(\hat{y}^{(i)})-(1-y^{(i)})ln(1-\hat{y}^{(i)}))
J(ω,b)=m1i=1∑mL(y^(i),y(i))=m1i=1∑m(−y(i)ln(y^(i))−(1−y(i))ln(1−y^(i)))
2.4 梯度下降(Gradient Descent)
G
r
a
d
i
e
n
t
D
e
s
e
n
t
:
GradientDesent:
GradientDesent:
R
e
c
a
p
:
y
^
=
σ
(
ω
T
x
+
b
)
,
σ
(
z
)
=
1
1
+
e
−
z
Recap:\hat{y}=\sigma(\omega^{T}x+b), {\sigma}(z)=\frac{1}{1+e{-z}}
Recap:y^=σ(ωTx+b),σ(z)=1+e−z1
J
(
ω
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
=
1
m
∑
i
=
1
m
(
−
y
(
i
)
l
n
(
y
^
(
i
)
)
−
(
1
−
y
(
i
)
)
l
n
(
1
−
y
^
(
i
)
)
)
J(\omega,b)=\frac{1}{m}\sum^{m}_{i=1}L(\hat{y}^{(i)},y^{(i)})=\frac{1}{m} \sum^{m}_{i=1}\left( -y^{(i)}ln(\hat{y}^{(i)})-(1-y^{(i)})ln(1-\hat{y}^{(i)})\right)
J(ω,b)=m1∑i=1mL(y^(i),y(i))=m1∑i=1m(−y(i)ln(y^(i))−(1−y(i))ln(1−y^(i)))
1.如下图所示,随机初识化
w
w
w
2.沿着梯度下降最快的地方一直走可以达到全局最低点
-
w
w
w的更新权值公式:
ω : = ω − α d J ( ω ) d ω \omega:=\omega-\alpha \frac{d J(\omega)}{d \omega} ω:=ω−αdωdJ(ω)
α \alpha α:表示学习率,
d J ( ω ) d ω \frac{d J(\omega)}{d\omega} dωdJ(ω):表示 J ( w , b ) J(w,b) J(w,b)对 w w w的导数
在二维平面的情况下:
该公式的更新会使J(w)逐渐向最低点逼近。 - 同理,
b
b
b的权值更新公式:
b : = b − α ∂ J ( w , b ) ∂ b b:=b-\alpha \frac{\partial J(w,b)}{\partial b} b:=b−α∂b∂J(w,b)
2.5 计算图(Computation Graph)
设有
J
(
a
,
b
,
c
)
=
3
(
a
+
b
c
)
J(a,b,c)=3(a+bc)
J(a,b,c)=3(a+bc),其中
a
=
5
,
b
=
3
,
c
=
2
a=5,b=3,c=2
a=5,b=3,c=2
令:
u
=
b
c
u=bc
u=bc
v
=
a
+
u
v=a+u
v=a+u
则
J
=
3
v
J=3v
J=3v
计算J的导数
d
J
d
v
=
3
\frac{dJ}{dv}=3
dvdJ=3
d
J
d
u
=
d
J
d
v
d
v
d
u
=
3
∗
1
\frac{dJ}{du}=\frac{dJ}{dv}\frac{dv}{du}=3*1
dudJ=dvdJdudv=3∗1,
d
J
d
a
=
d
J
d
v
d
v
d
a
=
3
∗
1
\frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da}=3*1
dadJ=dvdJdadv=3∗1,
d
J
d
b
=
d
J
d
u
d
u
d
b
=
3
∗
2
=
6
\frac{dJ}{db}=\frac{dJ}{du}\frac{du}{db}=3*2=6
dbdJ=dudJdbdu=3∗2=6
d
J
d
c
=
d
J
d
u
d
u
d
c
=
3
∗
3
=
9
\frac{dJ}{dc}=\frac{dJ}{du}\frac{du}{dc}=3*3=9
dcdJ=dudJdcdu=3∗3=9
反向传播
结合2.9中可以有形象理解
2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)
如图:在这个公式的外侧画上长方形。然后计算:
y
^
=
a
=
σ
(
z
)
\hat{y}=a=\sigma(z)
y^=a=σ(z)也就是计算图的下一 步。最后计算损失函数
L
(
a
,
y
)
L(a,y)
L(a,y)。 有了计算图,我就不需要再写出公式了。因此,为了使得 逻辑回归中最小化代价函数
L
(
a
,
y
)
L(a,y)
L(a,y),我们需要做的仅仅是修改参数
w
w
w和
b
b
b的值。
现在让我们来讨论通过反向计算 出导数。 因为我们想要计算出的代价函数
L
(
a
,
y
)
L(a,y)
L(a,y)的导数,首先我们需要反向计算出代价函 数
L
(
a
,
y
)
L(a,y)
L(a,y)关于
a
a
a的导数,在编写代码时,你只需要用
d
a
da
da来表示
d
L
(
a
,
y
)
d
a
\frac{dL(a,y)}{da}
dadL(a,y)。 通过微积分得到:
(1)
d
L
(
a
,
y
)
d
a
=
−
y
a
+
1
−
y
1
−
a
=
a
−
y
=
^
d
a
\frac{dL(a,y)}{da}=-\frac{y}{a}+\frac{1-y}{1-a}=a-y \ \hat{=} \ da \tag{1}
dadL(a,y)=−ay+1−a1−y=a−y =^ da(1)
(2)
d
z
=
^
d
L
d
z
=
d
L
d
a
⋅
d
a
d
z
dz\ \hat=\ \frac{\text dL}{\text dz}= \frac{\text dL}{\text da}\cdot \frac{\text da}{\text dz} \tag{2}
dz =^ dzdL=dadL⋅dzda(2)
(3)
d
a
d
z
=
a
⋅
(
1
−
a
)
\frac{\text da}{\text dz}=a\cdot(1-a)\tag{3}
dzda=a⋅(1−a)(3)
将
(
3
)
(3)
(3)式代入
(
2
)
(2)
(2)式,有:
(4)
d
L
d
z
=
a
−
y
\frac{\text dL}{\text dz}=a-y\tag{4}
dzdL=a−y(4)
最后计算
w
w
w和
b
b
b对代价函数
J
J
J的影响:
(5)
d
ω
1
=
^
d
L
d
ω
1
=
1
m
∑
i
m
x
1
(
i
)
(
a
(
i
)
−
y
(
i
)
)
d\omega_1\ \hat=\ \frac{dL}{d\omega_1}= \frac{1}{m}\sum_{i}^{m} {x_{1}^{(i)} (a^{(i)} -y^{(i)}) }\tag{5}
dω1 =^ dω1dL=m1i∑mx1(i)(a(i)−y(i))(5)
(6)
d
ω
2
=
^
d
L
d
ω
2
=
1
m
∑
i
m
x
2
(
i
)
(
a
(
i
)
−
y
(
i
)
)
d\omega_2 \ \hat=\ \frac{dL}{d\omega_2}= \frac{1}{m}\sum_{i}^{m} {x_{2}^{(i)} (a^{(i)} -y^{(i)}) }\tag{6}
dω2 =^ dω2dL=m1i∑mx2(i)(a(i)−y(i))(6)
(7)
d
b
=
^
d
L
d
b
=
1
m
∑
i
m
(
a
(
i
)
−
y
(
i
)
)
db\ \hat=\ \frac{dL}{db}=\frac{1}{m}\sum_{i}^{m} { (a^{(i)} -y^{(i)}) }\tag{7}
db =^ dbdL=m1i∑m(a(i)−y(i))(7)
最后更新权值:
(8)
w
1
=
w
1
−
α
d
L
d
w
1
=
w
1
−
α
⋅
d
w
1
w_1 = w_1 - \alpha\frac{dL}{dw_1}=w_1-\alpha\cdot dw_1\tag{8}
w1=w1−αdw1dL=w1−α⋅dw1(8)
(9)
w
2
=
w
2
−
α
d
L
d
w
2
=
w
2
−
α
⋅
d
w
2
w_2 = w_2 - \alpha\frac{dL}{dw_2}=w_2-\alpha\cdot dw_2\tag{9}
w2=w2−αdw2dL=w2−α⋅dw2(9)
(10)
b
=
b
−
α
d
L
d
b
=
b
−
α
⋅
d
b
b = b - \alpha\frac{dL}{db}=b-\alpha\cdot db\tag{10}
b=b−αdbdL=b−α⋅db(10)
2.10 Logistic Regression on m examples代码流程
首先初始化
J
=
0
,
d
w
1
=
0
,
d
w
2
=
0
,
d
b
=
0
J=0,\ dw_1=0,\ dw_2 =0,\ db=0
J=0, dw1=0, dw2=0, db=0
代码流(非正式代码):
for i in range(m):
z(i) = wx(i) + b
a(i) = sigmoid(z(i))
J += - ( y(i) * log(a(i)) +( 1-y(i) ) *log(1 - a(i) ) )
dz(i) = a(i) - y(i) #计算dL/dz
dw1 += x1(i) * dz(i) #计算dL/dw1
dw2 += x2(i) * dz(i) #计算dL/dw2
db += dz(i) #计算dL/db
J /= m
dw1 /= m
dw2 /= m
db /= m
w = w - alpha*dw
b = b - alpha*db
以上只应用了一步梯度下降,因此需要重复上面很多次。
但这种计算中有两个缺点,也就是说应用此方法在逻辑回归上你需要编写两个for循环。第一个 for 循环是一个小循环遍历m个训练样本,第二个 for 循环是一个遍历所有特征的 for 循环。这个例子中我们只有 2 个特征,所以
n
n
n等于 2 并且
n
x
n_x
nx 等于 2。 但如果你有更多特征, 你开始编写你的因此
d
w
1
dw_1
dw1,
d
w
2
dw_2
dw2,相似的计算一直下去到
d
w
n
x
dw_{n_x}
dwnx。所以看来你需要一 个 for 循环遍历所有n个特征。
2.11向量化表达(Vectorization)
假设有这么一个python的 f o r for for循环
z=0
for i in range(n_x):
z+=w[i]*x[i]
z+=b
这样计算会很慢,但是用向量化表达则计算会很快
import numpy as np
import time
n = 1000000
w = np.random.rand(n).reshape(n,1)
x = np.random.rand(n).reshape(n,1)#通过 round 随机得到两个一百万维度的数组
z=0
t1 = time.time()
for i in range(n_x):
z+=w[i]*x[i]
t2 = time.time()
print(z,'using time "%s"ms.'%((t2-t1)*1000))
[ 249835.28710158] using time "4013.7579441070557"ms.
t3 = time.time()
zz = np.dot(w.T,x) #使用向量化表达之后
t4 = time.time()
print(zz,'using time "%s"ms.'%((t4-t3)*1000))
[[ 249835.28710159]] using time "0.8718967437744141"ms.
2.13向量化逻辑回归(Vectorizing Logistic Regression)
-
首先我们回顾一下逻辑回归的前向传播步骤:
如果你有 m m m 个训
练样本,然后对第一个样本进行预测,计算 z z z,公式 z ( 1 ) = w T x 1 + b z^{(1)}=w^{T}x^{1}+b z(1)=wTx1+b。然后计算激活函数 a ( 1 ) = σ ( z ( 1 ) ) a^{(1)}=\sigma(z^{(1)}) a(1)=σ(z(1)),计算第一个样本的预测值 y ^ ( 1 ) \hat y^{(1)} y^(1)。 然后对第二个样本进行预测,需要计算 z ( 2 ) = w T x 2 + b z^{(2)}=w^{T}x^{2}+b z(2)=wTx2+b , a ( 2 ) = σ ( z ( 2 ) ) a^{(2)}=\sigma(z^{(2)}) a(2)=σ(z(2)) 。然后对第三个样本进行预测,需要计算 z ( 3 ) = w T x 3 + b z^{(3)}=w^{T}x^{3}+b z(3)=wTx3+b , a ( 3 ) = σ ( z ( 3 ) ) a^{(3)}=\sigma(z^{(3)}) a(3)=σ(z(3)) ,依次类推。如 果你有 m 个训练样本,则需要这样做 m 次,这样太耗时。 -
下面介绍向量化的编程方法:
核心思想是:向量化赋值,向量化运算
第 i i i个个体的属性值构成的列向量:
(2.13.1) x ( i ) = ( x ( 1 ) ( i ) x ( 2 ) ( i ) ⋮ x ( n x ) ( i ) ) \tag{2.13.1} x^{(i)}=\begin{pmatrix} x^{(i)}_{(1)} \\ x^{(i)}_{(2)}\\ \vdots\\ x^{(i)}_{(n_x)} \end{pmatrix} x(i)=⎝⎜⎜⎜⎜⎜⎛x(1)(i)x(2)(i)⋮x(nx)(i)⎠⎟⎟⎟⎟⎟⎞(2.13.1)
m个 x ( i ) x^{(i)} x(i)构成X矩阵:
(2.13.2) X = ( x ( 1 ) , x ( 2 ) , … , x ( m ) ) ( n x , m ) \text X=\begin{pmatrix} x^{(1)} ,x^{(2)} ,\dots,x^{(m)} \end{pmatrix}_{(n_{x},m)} \tag{2.13.2} X=(x(1),x(2),…,x(m))(nx,m)(2.13.2)
参数向量 w w w是一列 n x n_x nx维的列向量:
(2.13.3) w = ( w 1 w 2 ⋮ w m ) ( n x , 1 ) w=\begin{pmatrix} w_1\\ w_2\\ \vdots\\w_m \end{pmatrix}_{(n_x,1)} \tag{2.13.3} w=⎝⎜⎜⎜⎛w1w2⋮wm⎠⎟⎟⎟⎞(nx,1)(2.13.3)
(2.13.4) z ( i ) = w T x ( i ) + b z^{(i)}=w^{T} x^{(i)} + b\tag{2.13.4} z(i)=wTx(i)+b(2.13.4)
m个 z ( i ) z^{(i)} z(i)构成的行向量:
(2.13.5) Z = ( z ( 1 ) , z ( 2 ) , ⋯   , z ( m ) ) Z=\begin{pmatrix} z^{(1)},z^{(2)},\cdots,z^{(m)} \end{pmatrix} \tag{2.13.5} Z=(z(1),z(2),⋯,z(m))(2.13.5)
求 Z Z Z只需要一行代码:Z = np.dot(w.T,b)
A为 σ ( Z ) \sigma(Z) σ(Z)是一个m维的行向量:
(2.13.5) A = σ ( Z ) = ( a ( 1 ) , a ( 2 ) , ⋯   , a ( m ) ) A =\sigma(Z)= \begin{pmatrix} a^{(1)},a^{(2)},\cdots,a^{(m)} \end{pmatrix} \tag{2.13.5} A=σ(Z)=(a(1),a(2),⋯,a(m))(2.13.5)
2.14 向量化Logistic回归的梯度(Vectorizing Logistic Regression’s Gradient)
第一个个体的损失函数
L
(
1
)
L^{(1)}
L(1)对
z
(
1
)
z^{(1)}
z(1)的偏导数:
d
L
(
1
)
d
z
(
1
)
=
a
(
1
)
−
y
(
1
)
=
^
d
z
(
1
)
\frac{dL^{(1)}}{dz^{(1)}}= a^{(1)}-y^{(1)}\ \hat= \ dz^{(1)}
dz(1)dL(1)=a(1)−y(1) =^ dz(1)
第二个个体的损失函数
L
(
2
)
L^{(2)}
L(2)对
z
(
2
)
z^{(2)}
z(2)的偏导数:
d
L
(
2
)
d
z
(
2
)
=
a
(
2
)
−
y
(
2
)
=
^
d
z
(
2
)
\frac{dL^{(2)}}{dz^{(2)}}= a^{(2)}-y^{(2)}\ \hat= \ dz^{(2)}
dz(2)dL(2)=a(2)−y(2) =^ dz(2)
…
\dots
…
第m个个体的损失函数
L
(
m
)
L^{(m)}
L(m)对
z
(
m
)
z^{(m)}
z(m)的偏导数:
d
L
(
m
)
d
z
(
m
)
=
a
(
m
)
−
y
(
m
)
=
^
d
z
(
m
)
\frac{dL^{(m)}}{dz^{(m)}}= a^{(m)}-y^{(m)}\ \hat= \ dz^{(m)}
dz(m)dL(m)=a(m)−y(m) =^ dz(m)
Y
=
(
y
(
1
)
,
y
(
2
)
,
⋯
 
,
y
(
m
)
)
Y= (y^{(1)},y^{(2)},\cdots,y^{(m)})
Y=(y(1),y(2),⋯,y(m))
d
Z
dZ
dZ是一个m维的行向量,
d
Z
=
A
−
Y
=
(
d
z
(
1
)
,
d
z
(
2
)
,
⋯
 
,
d
z
(
m
)
)
dZ = A-Y = (dz^{(1)},dz^{(2)},\cdots,dz^{(m)})
dZ=A−Y=(dz(1),dz(2),⋯,dz(m))
d w = 1 m ⋅ X ⋅ ( d Z ) T dw = \frac{1}{m}\cdot X \cdot ({dZ})^{T} dw=m1⋅X⋅(dZ)T
d b = 1 m ∑ ( d Z ) db=\frac{1}{m}\sum(dZ) db=m1∑(dZ)
d
Z
,
d
w
,
d
b
dZ,dw,db
dZ,dw,db的定义沿用2.9节中所述。
则向量化的一次梯度更新的python代码流程为:
Z = np.dot(w.T, X) + b
A = sigma(Z)
dZ = A - Y
dw = (1/m)*X*(dZ).T
db = (1/m)*np.sum(dZ)
w = w - a * dw
b = b - a * db
最后在此基础上来个for循环m次,作m次梯度更新。
2.18 Logistic损失函数的来由(Explanation of Logistic Regression cost function)(待深入探究)
在逻辑回归中,需要预测的结果
y
^
\hat{y}
y^可以表示为
y
^
=
σ
(
w
T
x
+
b
)
\hat{y}=\sigma(w^{T}x+b)
y^=σ(wTx+b),
σ
\sigma
σ是我们熟悉的S型曲线
σ
(
z
)
=
σ
(
w
T
x
+
b
)
=
1
1
+
e
−
z
\sigma(z)=\sigma(w^{T}x+b)=\frac{1}{1+e^{-z}}
σ(z)=σ(wTx+b)=1+e−z1。约定
y
^
=
p
(
y
=
1
∣
x
)
\hat{y}=p(y=1|x)
y^=p(y=1∣x),即算法的输出
y
^
\hat y
y^是给定训练样本个体
x
x
x条件下
y
=
1
y=1
y=1的概率。即:
如果
y
=
1
y=1
y=1,在给定训练个体
x
x
x条件下算出的概率为
y
^
\hat y
y^:
(2.18.1)
I
f
y
=
1
:
p
(
y
∣
x
)
=
y
^
If \ \ y=1: \ \ p(y|x)=\hat{y}\tag{2.18.1}
If y=1: p(y∣x)=y^(2.18.1)
如果
y
=
0
y=0
y=0,在给定训练个体
x
x
x的条件下算出的概率为
1
−
y
^
1-\hat y
1−y^:
(2.18.2)
I
f
y
=
0
:
p
(
y
∣
x
)
=
1
−
y
^
If \ \ y=0: \ \ p(y|x)=1-\hat{y}\tag{2.18.2}
If y=0: p(y∣x)=1−y^(2.18.2)
整合
(
2.18.1
)
(2.18.1)
(2.18.1)和
(
2.18.2
)
(2.18.2)
(2.18.2)两个式子得:
(2.18.3)
P
(
y
∣
x
)
=
y
^
y
⋅
(
1
−
y
^
)
1
−
y
P(y|x)=\hat{y}^{y} \cdot (1-\hat{y})^{1-y}\tag{2.18.3}
P(y∣x)=y^y⋅(1−y^)1−y(2.18.3)
两边同时取对数:
(2.18.4)
L
n
P
(
y
∣
x
)
=
y
l
n
y
^
+
(
1
−
y
)
l
n
(
1
−
y
^
)
LnP(y|x) =yln\hat{y} +(1-y)ln(1-\hat{y})\tag{2.18.4}
LnP(y∣x)=ylny^+(1−y)ln(1−y^)(2.18.4)
由于log函数是严格单调递增的,最大化
l
n
P
(
y
∣
x
)
lnP(y|x)
lnP(y∣x)等价于最大化
P
(
y
∣
x
)
P(y|x)
P(y∣x)并且计算
P
(
y
∣
x
)
P(y|x)
P(y∣x)的对数,就是计算
l
n
P
(
y
∣
x
)
lnP(y|x)
lnP(y∣x),即
(
2.18.4
)
(2.18.4)
(2.18.4)式。
(
2.18.4
)
(2.18.4)
(2.18.4)就是前文提到的损失函数的负数,即
−
L
(
y
^
,
y
)
-L(\hat{y},y)
−L(y^,y)。有个负号的原因是,当我们训练学习算法时要以最大的概率预测这个值,然而在逻辑回归中我们需要最小化损失函数。