Logistic regression

本文讲述如何用深度学习的角度来对机器学习里的Logistic Regression进行实现。

1. 我们对数据样本的样式进行定义。

假设我们有一系列训练样本x_{1},x_{2},...,x_{m},对应的类别为y_{1},y_{2},...,y_{m}.其中x\in\mathbb{R}^{n*1},y\in\mathbb{R}^{1}y\in\mathbb\{1,0\}(因为Logistic是适用于两类问题的,所以这里的target是两值)
X=\begin{bmatrix} x_{1} &x_{2} &... &x_{m} \end{bmatrix},
Y=\begin{bmatrix} y_{1} &y_{2} &... &y_{m} \end{bmatrix}
X\in\mathbb{R}^{n*m},Y\in\mathbb{R}^{1*m}.
从上述可以得知,我们需要求的模型是给定x,求出其对应的类别概率\hat{y}=P(y=1|x)
用线性模型来拟合我们的数据\hat{y}=w^{T}x+b的基础上,为了使y的范围可以限定在{0,1}之内,我们引入一个函数:\sigma(z)=\frac{1}{1+e^{-z}},\sigma(z)\in(0,1)
z\rightarrow+\infty(很大)的时候,e^{-z}很小,\sigma(z)\approx1
z\rightarrow-\infty(很小)的时候,e^{-z}很大,\sigma(z)\approx0
我们可以把拟合模型改写为
\hat{y}=\sigma(w^{T}x+b)
**其中w^{T}x+b可以通过对样本x添加一项x0=1在程序中改写为\theta^{T}x其中x\in\mathbb{R}^{(n+1)*1},\theta\in\mathbb{R}^{(n+1)*1}.
\theta=\begin{bmatrix} \theta_0\\ \theta_1\\ \theta_2\\ ...\\ \theta_n \end{bmatrix},即 \theta_0=b,\begin{bmatrix} \theta_1\\ \theta_2\\ ...\\ \theta_n \end{bmatrix}=w

2. 对模型的损失函数求梯度。

\hat{y}=\sigma(w^{T}x+b),其中 \sigma(z)=\frac{1}{1+e^{-z}}
给定\{(x^{(1)},y^{(1)}),...,(x^{(m)},y^{(m)})\},希望\hat{y^{(i)}}\approx y^{(i)}
损失函数(Loss(error)function):原线性模型的损失函数公式为
L(\hat{y},y)=\frac{1}{2}(\hat(y)-y)^2,但是在当前公式下使用这个公式得到的损失函数,无法拟合,所以,我们根据Logistic模型的特性,对判错进行误差(loss)统计,可以得到
如下公式:
L(\hat{y},y)=-(ylog\hat{y}+(1-y)log(1-\hat{y}))
我们可以分成两种情况来看这公式。
y=1:L(\hat{y},y)=-log\hat{y}
此时,\hat{y}\rightarrow1,L(\hat{y},y)\rightarrow0
y=0:L(\hat{y},y)=-log(1-\hat{y})
此时,\hat{y}\rightarrow0,L(\hat{y},y)\rightarrow0
反之则loss的值变大。
Cost Function:J(w,b)=\frac{1}{m} \sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})
=-\frac{1}{m} [\sum_{i=1}^{m}y^{(i)}log\hat{y^{(i)}}+(1-y^{(i)})log(1-\hat{y}^{(i)})]
梯度下降:
我们希望找到w,b的值,使cost function值最小。
我们以如下这个简单的模型来做例子。

example.png

其中
da =\frac{\partial{L(a,y)}}{\partial{a}}=-\frac{y}{a}+\frac{1-y}{1-a}

dz =\frac{\partial{L(a,y)}}{\partial{z}}=\frac{\partial{L(a,y)}}{\partial{a}}\frac{\partial{a}}{\partial{z}}

其中
\frac{\partial{a}}{\partial{z}}=a(1-a)

所以可以求得
dz =a-y

\frac{\partial{L(a,y)}}{\partial{w_{1}}}=dw_{1}=x_{1}*dz

\frac{\partial{L(a,y)}}{\partial{w_{2}}}=dw_{2}=x_{2}*dz

\frac{\partial{L(a,y)}}{\partial{b}}=db=dz

参数求解:
w_{1}:=w_{1}-\alpha dw_{1}

w_{2}:=w_{2}-\alpha dw_{2}

b:=b-\alpha db

3. 伪代码实现

J=0,dw_{1}=0,dw_{2}=0,db=0
for i=1 to m
z^{(i)}=w^{T}x^{(i)}+b
a^{(i)} = \sigma(z^{(i)})
Jt = -[y^{(i)}loga^{(i)}+(1-y^{(i)})log(1-a^{(i)})]
dz^{i}=a^{(i)}-y^{(i)}
dw_{1}+=x^{i}_1*dz^{(i)}
dw_{2}+=x^{i}_2*dz^{(i)}
b+=\alpha dz^{(i)}
end for
J /=m,dw_1/=m,dw_2/=m,db/=m
w_{1}:=w_{1}-\alpha dw_{1}
w_{2}:=w_{2}-\alpha dw_{2}
b:=b-\alpha db

Vectorization

do the caculation without for loop to save time


Vectorization.png

4. 神经网络编程准则

只要可能,避免显式的for循环。

avoidloop.png

使用numpy的系统函数来进行矩阵或者向量的批量模式运算。
matrixexp.png

把之前的编程伪代码用上述规则进行如下修改:vectCaculation.png
VectorizationCa.png

VectorizationProgramm.png

未完待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容