I don't know what|

Sheldon2

园龄:3年3个月粉丝:2关注:4

具有神经网络思维的Logistic回归

第二周神经网络编程基础

来源:CSDN(何宽

authorSheldon

本文是我的个人理解


在正式谈神经网络之前,我们必须重新开始说一下逻辑回归

逻辑回归中的梯度下降

我们首先先来考虑只有一个样本的情况,稍后我们再来谈如果有m个样本该怎么做。

假设我们有一个上述的一个逻辑回归:那么我们可以得到如下的三个式子

z=wTx+b

y^=a=σ(z)

L(a,y)=(ylog(a)+(1y)log(1a))

在这个例子中我们假设只有两个特征x1x2

为了计算z我们需要输入参数w1,w2,b,x1,x2

那么这里的z=w1x1+w2x2+b只是我们w用的向量的形式表示

相信前向传播大家应该都不会陌生,我们只需要计算出L这个参数即可

那么前向传播的代码如下

# 注:我们先考虑 m = 1的情况,下述代码是考虑m = m的情况,读者可自行把m看成1
def propagate(w,b,X,Y):
"""
w - 表示权重 这里w.shape = (样本属性个数,1)
b - 偏移量 是一个标量
X - 我们的样本 X.shape = (样本属性个数,训练样本的个数)
Y - 标签 是一个向量 Y.shape = (1,训练样本个数)
"""
m = X.shape[1] # 这样我们得到有多少个训练样本个数
# 不知道为什么A这么表示,看上面的公式
A = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
#...未完待续...

需要解释的是上述的A是一个标量

接下来我们来讨论一下反向传播:

logistic回归中我们需要做的是变换参数wb的值,来最小化损失函数

下面我们讨论如何向后,计算偏导数

我们一步一步计算:

  1. 首先我们先来计算La求导

    已知的式子:

    L(a,y)=(ylog(a)+(1y)log(1a))

    求导后得到如下式子:

da=dL(a,y)da=ya+1y1a

  1. 计算az求导

    已知的式子:

    a=σ(z)=11+ez

    求导后得到如下式子:

    a=[11+et]=(1+ez)2et=et(1+ez)2=a(1a)

  2. 通过链式法则我们可以得到Lz求导

dz=dL(a,y)dz=dLdadadz=(ya+1y1a)a(1a)=ay

  1. 反向传播的最后一步,来计算wb是如何变化的

dw1=Lw1=dLdadadzdzdw1=dLdzdzdw1=x1dz

​ 同理可得

dw2=x2dz

db=dz

  1. 那么我们可以通过梯度下降更新我们的wb

    w1:=w1αdw1

    w2:=w2αdw2

    b:=bαdb

这样我们就完成了我们的反向传播

代码如下

# 注:我们先考虑 m = 1的情况,下述代码是考虑m = m的情况,读者可自行把m看成1
def propagate(w,b,X,Y):
"""
w - 表示权重 这里w.shape = (样本属性个数,1)
b - 偏移量 是一个标量
X - 我们的样本 X.shape = (样本属性个数,训练样本的个数)
Y - 标签 是一个向量 Y.shape = (1,训练样本个数)
"""
m = X.shape[1] # 这样我们得到有多少个训练样本个数
# 不知道为什么A这么表示,看上面的公式
A = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
#...续上...
dw = (1 / m) * np.dot(X, (A - Y).T) # w的形状和dw是一样的
db = (1 / m) * np.sum(A - Y)
# 最后我们使用字典把dw和db保存起来
grads = {
"dw":dw,
"db":db
}
return (grads,cost)

至此我们就定义好了我们的函数

以上则是只有一个样本的情况


接下来我们来讨论m个样本的情况

我们可以使用最笨的方法,使用for i in range(m)这样我们就可以遍历所有的样本,求出一个dwdb然后再进行迭代。这样做的缺点就是太慢了。因此我们要使用向量化

再次强调我们的损失函数J是一个标量

我们需要把每个样本的预测值与实际值进行计算,通过累加得到最终的损失函数,因此表达式如下

J=1mi=1mL(a(i),y(i))=(y(i)log(a(i))(1y(i))log(1a(i)))

dw的向量表示

我们知道只有一个样本时

dw1=Lw1=dLdadadzdzdw1=dLdzdzdw1=x1dz

dz=(ay)

那么有m个样本的话,可得

dw1=x1dz1

dw2=x2dz2

...

dwm=xmdzm

写成向量

dwn×1=Xn×m(AY)m×1T

那么到这里我想你对公式推导有了一定的理解,完整代码及实例见CSDN(何宽

本文作者:Sheldon2

本文链接:https://www.cnblogs.com/Sheldon2/p/16684222.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Sheldon2  阅读(87)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起