np实现sigmoid_【强基固本】基础算法:使用numpy实现逻辑回归随机梯度下降(附代码)...
深度学习算法工程师面试,记录一道较为基础的笔试题:
输入:目标向量Y(N*1),矩阵X(N*K);输出:使用随机梯度下降求得的逻辑回归系数W(K+1)。
分析:该问题需要先列出逻辑回归的函数解析式,再选择损失函数,最后算出损失函数关于更新参数的导数,即可开始随机梯度下降。
作者:Algernon
地址:https://www.zhihu.com/people/thisiszhou
01
逻辑回归解析式
其中
02
Loss函数
由于逻辑回归的输出值在[0, 1]之间,并且逻辑回归虽然名字为回归,但实际是分类任务,所以损失函数使用交叉熵。其中交叉熵函数解析式为:y为label,y‘为预测值,N为y的长度。
03
关于更新参数的导数
更新参数有 ,b,Loss的解析式为:为了便于求导,我们换一种写法,其中sum函数相当于给后面的列向量乘一个都为1的行向量S:其中 为矩阵乘法,CE和 都是逐元素函数,则:其中(其中 为逐元素乘法,在最后的计算中,逐元素乘法优先级比矩阵乘法优先级高)
04
参数更新(梯度下降)
其中 为学习率。
05
代码实现
先封装一下涉及到的函数:
import numpy as np
from random import shuffle
# sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 交叉熵函数
def ce(y, y_label):
return -y_label*np.log(y) - (1-y_label)*np.log(1-y)
# 交叉熵函数导数
def ce_grad(y, y_label):
return -y_label/y + (1-y_label)/(1-y)
初始化参数以及输入:
# 确定随机性唯一
np.random.seed(32)
n = 6
k = 7
# 随机初始化输入与参数
X = np.random.rand(n,k)
y_label = np.random.randint(0,2,size=(n,1)).astype(np.float32)
w = np.random.rand(k,1)
b = np.random.rand(1,1)
前向函数:
def forward(X, w, b):
y1 = np.dot(X, w) + b
y2 = sigmoid(y1)
y3 = ce(y2,y_label)
loss = sum(y3)
return y1, y2, y3, loss
反向求导:
def gradients(y1, y2, y3, X, y_label):
grad1 = np.ones(len(y3))
grad2 = ce_grad(y2, y_label)
grad3 = sigmoid(y1)*(1-sigmoid(y1))
grad4_w = X
grad4_b = 1
return (
np.dot(grad1, grad2*grad3*grad4_w),
np.dot(grad1, grad2*grad3*grad4_b)
)
grad_w数值:
array([2.34286961, 2.97101168, 1.98692618, 1.81275096, 2.52826215,
2.42595535, 1.9706045 ])
使用tensorflow进行验证:
import tensorflow as tf
def ce(y, y_label):
return -y_label*tf.log(y) - (1-y_label)*tf.log(1-y)
X = tf.Variable(X)
w = tf.Variable(w)
b = tf.Variable(b)
y1 = tf.matmul(X, w) + b
y2 = tf.sigmoid(y1)
y3 = ce(y2, y_label)
loss = tf.reduce_sum(y3)
grad = tf.gradients(loss, w)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
ret = sess.run(grad)
grad数值:
array([[2.34286961],
[2.97101168],
[1.98692618],
[1.81275096],
[2.52826215],
[2.42595535],
[1.9706045 ]])
可见我们自己计算的导数没有问题。使用随机梯度下降进行参数更新。随机梯度下降,一般会随机选择batch,这里为了简便,直接将所有向量进行BP:训练过程:
yita = 1e-2
train_num = 10000
for i in range(train_num):
y1, y2, y3, loss = forward(X, w, b)
g_w, g_b = gradients(y1, y2, y3, X, y_label)
w -= yita*g_w.reshape([-1, 1])
b -= yita*g_b
if i % 1000 == 0:
print("loss:", loss)
输出:
loss: [11.6081676]
loss: [1.18844796]
loss: [0.71728752]
loss: [0.49936237]
loss: [0.37872785]
loss: [0.30340733]
loss: [0.25233963]
loss: [0.21561081]
loss: [0.18800623]
loss: [0.16654284]
之后看看forward输出:
>>> forward(X, w, b)[1]
array([[0.01485668],
[0.00538101],
[0.01436137],
[0.01684294],
[0.0247247 ],
[0.93002105]])
y_label:
>>> y_label
array([[0.],
[0.],
[0.],
[0.],
[0.],
[1.]], dtype=float32)
06
总结
BP过程相对基础,但确实不是很简单。例如,此题loss关于w的导数,是典型的标量关于向量求导。关于向量、矩阵的求导,推荐以下文章:https://zhuanlan.zhihu.com/p/24709748
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
直播预告
左划查看更多
历史文章推荐
【CVPR 2020 Tutorial】如何写好论文和评审(概述)
如何撰写高水平的博士论文?超全论文指导!
北大读博手记:怎样完成自己的博士生涯?非常具有指导性!
太牛逼了!一位中国博士把整个CNN都给可视化了,每个细节看的清清楚楚!
Nature发表牛津博士建议:我希望在读博士之初时就能知道的20件事
沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题
如何看待2021年秋招算法岗灰飞烟灭?
独家解读 | ExprGAN:基于强度可控的表情编辑
独家解读 | 矩阵视角下的BP算法
独家解读 | Capsule Network深度解读
独家解读 | Fisher信息度量下的对抗攻击
论文解读 | 知识图谱最新研究综述
你的毕业论文过了吗?《如何撰写毕业论文?》
卡尔曼滤波系列——经典卡尔曼滤波推导
分享、点赞、在看,给个三连击呗!
np实现sigmoid_【强基固本】基础算法:使用numpy实现逻辑回归随机梯度下降(附代码)...相关推荐
- 线性收敛的随机优化算法之 SAG、SVRG(随机梯度下降)
原文出处:https://zhuanlan.zhihu.com/p/22402784?utm_source=tuicool&utm_medium=referral 这篇文章回顾了基于梯度的随机 ...
- 逻辑回归算法c语言_逻辑回归算法背后的数学
逻辑回归算法背后的数学 看完深蓝学院的机器学习公开课后,对于逻辑回归部分,打算写篇学习笔记记录总结一下,也和大家共同分享. 1 基本思能 逻辑回归(Logistic Regression)和线性回归( ...
- 动手学深度学习——基础优化算法梯度下降,小批量随机梯度下降
一.梯度下降算法 挑选一个初始值w0: 重复迭代参数t=1,2,3: 在接下来不断的更新w0,使它接近最优解: 具体来说,法则如下: wt等于wt的上一时刻减去η乘以损失函数关于wt的上一时刻的梯度. ...
- 深度学习系列之随机梯度下降(SGD)优化算法及可视化
补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...
- 深度学习必备:随机梯度下降(SGD)优化算法及可视化
补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...
- 机器学习:SVM、软间隔、随机梯度下降SVM线性算法
文章目录 SVM目标函数 SVM目标函数推导 函数间隔: 几何间隔: 软间隔.松弛 HingeLoss和软间隔 随机梯度下降算法 线性SVM的算法描述: 线性SVM算法实现: SVM目标函数 SVM目 ...
- 深度学习的优化算法——梯度下降和随机梯度下降
深度学习的优化算法--梯度下降和随机梯度下降 优化算法在深度学习中存在的问题 优化在深度学习中有很多挑战,下面描述其中两个,局部最小值和鞍点. 1.局部最小值 深度学习模型的目标函数可能存在若干极点- ...
- 机器学习算法(3)—— 逻辑回归算法
逻辑回归算法 1 逻辑回归介绍 2 损失及优化 3 逻辑回归的使用 4 分类评估方法 4.1 混淆矩阵 4.2 ROC曲线与AUC指标 4.3 ROC曲线绘制 5 分类中类别不平衡问题 5.1 过采样 ...
- 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)
目录 梯度 梯度下降 常用的梯度下降算法(BGD,SGD,MBGD) 梯度下降的详细算法 算法过程 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic ...
最新文章
- php面试题11(边看边复习刚刚讲的)(array_multisort($arr1,$arr2); 用$arr1来排序$arr2。)...
- JS中window.showModalDialog()详解
- 博客园的祥和需要大家共同努力
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...
- PAIP.MYSQL设置远程账户登陆总结
- Windows PowerShell命令大全
- android自定义壁纸制作,如何为Android制作自己的自定义壁纸 | MOS86
- 在Mac上将移动磁盘格式化为FAT32分区
- 第三章 准备工作 极值点
- Word怎么在空白处添加下划线
- 把tif文件转化成jpg格式报错已解决
- HTC Vive Pro eye 眼动数据简单获取
- 计算机管理器鼠标不见了怎么办,电脑的鼠标光标消失了
- torch 显存管理
- 打开计算机显示服务器失败,win10系统打开windows Media player提示服务器运行失败的详细步骤...
- java安全体系:JCA、JCE、JSSE、JAAS
- erlang使用httpc:request报错nxdomain
- 记一次拿webshell踩过的坑(如何利用PHP编写一个不包含数字和字母的后门)
- google收购了recapcha?
- linux hdmi输出快捷键,Linux下的投影仪HDMI输出设置
热门文章
- java创建线程的两种方法是_java创建线程的两种方法
- dijkstra邻接表_[力扣743] 带权邻接表的单源最短路
- verilog赋多位值_Verilog入门学习笔记——第一弹
- ae制作小球轨迹运动_关于3D建筑漫游动画制作流程及技术详解
- liunx 加入域控_[整理篇]linux加入windows域之完美方案
- halcon窗体的移动和缩放_halcon与C#联合编程之鼠标控制图片缩放,拖动,roi
- LiteIDE调试工具delve
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- tomcat组播实现session一致性_java会话技术-Session
- oracle多少钱一套_消防水炮多少钱一套?您真的只需要一套吗