logistic regression

原文链接: COURSERA:逻辑回归和梯度下降.

logistic regression

logistic regression相当于是神经网络中的一个神经元,在记录之前先约定一些符号
x(i)i x^{(i)}指第i个样本本

xj(i)ij x_j^{(i)}指第i个样本的第j个特征值

z(i)i线 z^{(i)}指的是第i个样本经过线性变换后的特征向量

a(i)i a^{(i)}指的是第i个样本经过激活函数后的值

整个算法的结构如下图所示:

在这里插入图片描述

​ 假如我们的训练向量是一幅图,首先将三维RGB(或者其他格式)展开为一维列向量,记为X(i)X^{(i)},经过标准化处理将数据缩放到[0,1]的范围内,对于每一个x(i)x^{(i)}:
z(i)=wTx(i)+b(1) z^{(i)} = w^T x^{(i)} + b \tag{1}

y^(i)=a(i)=sigmoid(z(i))(2) \hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)})\tag{2}

L(a(i),y(i))=y(i)log(a(i))(1y(i))log(1a(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))\mathcal{L}(a^{(i)}, y^{(i)})是损失函数,直观的来看这个函数,举例:

  • –当模型比较好时,当正确结果为正例时,y(i)y^{(i)}为1,此时(1y(i))log(1a(i))(1-y^{(i)} ) \log(1-a^{(i)})是0,a(i)a^{(i)}会很接近1,y(i)log(a(i))- y^{(i)} \log(a^{(i)})就接近0,L\mathcal{L}就小。负例同理。

  • –当模型比较差时,当正确结果为正例时,y(i)y^{(i)}为1,此时(1y(i))log(1a(i))(1-y^{(i)} ) \log(1-a^{(i)})是0,a(i)a^{(i)}会比1小很多,y(i)log(a(i))- y^{(i)} \log(a^{(i)})的值就会比较大,L\mathcal{L}就小。负例同理。

梯度下降

在对所有的训练样例都进行了一次上述公式1-3的过程后(称之为1个echo),就需要对权值ww和偏倚bb进行优化,优化的依据就是最小化损失函数。

对所有的训练样例,损失函数:
Jw,b=1mi=1mL(a(i),y(i))(4) J(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)})\tag{4}
梯度下降的具体步骤为:

​ 1.计算损失函数对所有参数的导数,计算出梯度 (需要下降多少)

​ 2.在原来的基础上减去梯度

符号说明:
dw:Jw dw:J对w的梯度

db:Jb db:J对b的梯度

具体做法(单个样本):
z=w1x1+w2x2+ba=σ(z)L=ylog(a)(1y)log(1a) z = w_1x_1+w_2x_2 + b \quad → \quad a=σ(z) \quad → \quad \mathcal{L} = - y \log(a )- (1-y ) \log(1-a)
那么
dLda=ya+1y1a \frac{d\mathcal{L}}{da}=-\frac{y}{a}+\frac{1-y}{1-a}

Lz=dLdadadz=ay \frac{\partial \mathcal{L}}{\partial z} = \frac{d\mathcal{L}}{da}\frac{da}{dz}=a-y

由于:
Lw1=Lzzw1=Lzx1=(ay)x1 \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

Lw2=Lzzw2=Lzx2=(ay)x2 \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

那么:
Lw=Lzzw=Lzx=x(ay) \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)

Lb=Lzzb=Lz1=ay \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
对于mm个样本:

mm个样本的L\mathcal{L}dLdw\frac{d\mathcal{L}}{dw}dLdb\frac{d\mathcal{L}}{db}叠加得到JJdJdw\frac{dJ}{dw}dJdb\frac{dJ}{db}:
J=1mJ \mathcal{J} = \frac{1}{m} J

Jw=1mJw \frac{\partial \mathcal{J}}{\partial w} = \frac{1}{m} \frac{\partial J}{\partial w}

Jb=1mJb \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \frac{\partial J}{\partial b}

最后进行权值更新:
w=wαJw(5) w = w - α\frac{\partial \mathcal{J}}{\partial w} \tag{5}

b=bαJb(6) b = b - α\frac{\partial \mathcal{J}}{\partial b} \tag{6}

将计算向量化

在上面的过程中,我们注意到对于多个训练样例,一个echo就会有多个循环:

for sample in samples:  #对每个样本遍历
    for i in sample:  #对样本每个参数

for循环所花费的时间是比矩阵运算多很多,所以要运用python的广播机制numpy运算将for循环转换为矩阵运算。

转换过程的最关键的点就是横向量和列向量的转换,要把对的元素对应起来,现在来规范一下向量格式。

训练数据Xn_ymX_{n\__y*m}:
KaTeX parse error: Undefined control sequence: \ at position 35: …trix} .&.&.&.\\\̲ ̲.&.&.&.\\\ x^{(…
权重ww:
w=[w1w2...wn_y] w=\left[ \begin{matrix}w_1\\w_2\\...\\w_{n\__y} \end{matrix}\right]

b=[b]广b=[b1,b2,...bm] b=\left[ b \right]广播后b=\left[ b_1,b_2,...b_m \right]

那么:
A=σ(wTX+b)=[a(1),a(2),...,a(m)] A=σ(w^TX+b)=\left[ a^{(1)},a^{(2)},...,a^{(m)} \right]
最后的梯度:
Jw=1mX(AY)T(7) \frac{\partial \mathcal{J}}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{7}

Jb=1mi=1m(a(i)y(i))(8) \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\tag{8}

最后按照公式5、6进行权值更新。

{J}}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{7}
$$

Jb=1mi=1m(a(i)y(i))(8) \frac{\partial \mathcal{J}}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\tag{8}

最后按照公式5、6进行权值更新。

发布了4 篇原创文章 · 获赞 0 · 访问量 3107
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览