具有神经网络思维的Logistic回归
第二周神经网络编程基础
来源:CSDN(何宽)
本文是我的个人理解
在正式谈神经网络之前,我们必须重新开始说一下逻辑回归
逻辑回归中的梯度下降
我们首先先来考虑只有一个样本的情况,稍后我们再来谈如果有m个样本该怎么做。
假设我们有一个上述的一个逻辑回归:那么我们可以得到如下的三个式子
在这个例子中我们假设只有两个特征
为了计算
那么这里的
相信前向传播大家应该都不会陌生,我们只需要计算出
那么前向传播的代码如下
# 注:我们先考虑 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是一个标量
接下来我们来讨论一下反向传播:
在
下面我们讨论如何向后,计算偏导数
我们一步一步计算:
-
首先我们先来计算
对 求导已知的式子:
求导后得到如下式子:
-
计算
对 求导已知的式子:
求导后得到如下式子:
-
通过链式法则我们可以得到
对 求导
- 反向传播的最后一步,来计算
和 是如何变化的
同理可得
-
那么我们可以通过梯度下降更新我们的
和
这样我们就完成了我们的反向传播
代码如下
# 注:我们先考虑 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)
这样我们就可以遍历所有的样本,求出一个dw
和db
然后再进行迭代。这样做的缺点就是太慢了。因此我们要使用向量化
再次强调我们的损失函数
我们需要把每个样本的预测值与实际值进行计算,通过累加得到最终的损失函数,因此表达式如下
dw的向量表示
我们知道只有一个样本时
那么有m个样本的话,可得
写成向量
那么到这里我想你对公式推导有了一定的理解,完整代码及实例见CSDN(何宽)
本文作者:Sheldon2
本文链接:https://www.cnblogs.com/Sheldon2/p/16684222.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步