深度学习算法工程师面试,记录一道较为基础的笔试题:

输入:目标向量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 npfrom 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 = 6k = 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 tfdef 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) + by2 = 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-2train_num = 10000for 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_labelarray([[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实现逻辑回归随机梯度下降(附代码)...相关推荐

  1. 线性收敛的随机优化算法之 SAG、SVRG(随机梯度下降)

    原文出处:https://zhuanlan.zhihu.com/p/22402784?utm_source=tuicool&utm_medium=referral 这篇文章回顾了基于梯度的随机 ...

  2. 逻辑回归算法c语言_逻辑回归算法背后的数学

    逻辑回归算法背后的数学 看完深蓝学院的机器学习公开课后,对于逻辑回归部分,打算写篇学习笔记记录总结一下,也和大家共同分享. 1 基本思能 逻辑回归(Logistic Regression)和线性回归( ...

  3. 动手学深度学习——基础优化算法梯度下降,小批量随机梯度下降

    一.梯度下降算法 挑选一个初始值w0: 重复迭代参数t=1,2,3: 在接下来不断的更新w0,使它接近最优解: 具体来说,法则如下: wt等于wt的上一时刻减去η乘以损失函数关于wt的上一时刻的梯度. ...

  4. 深度学习系列之随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  5. 深度学习必备:随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  6. 机器学习:SVM、软间隔、随机梯度下降SVM线性算法

    文章目录 SVM目标函数 SVM目标函数推导 函数间隔: 几何间隔: 软间隔.松弛 HingeLoss和软间隔 随机梯度下降算法 线性SVM的算法描述: 线性SVM算法实现: SVM目标函数 SVM目 ...

  7. 深度学习的优化算法——梯度下降和随机梯度下降

    深度学习的优化算法--梯度下降和随机梯度下降 优化算法在深度学习中存在的问题 优化在深度学习中有很多挑战,下面描述其中两个,局部最小值和鞍点. 1.局部最小值 深度学习模型的目标函数可能存在若干极点- ...

  8. 机器学习算法(3)—— 逻辑回归算法

    逻辑回归算法 1 逻辑回归介绍 2 损失及优化 3 逻辑回归的使用 4 分类评估方法 4.1 混淆矩阵 4.2 ROC曲线与AUC指标 4.3 ROC曲线绘制 5 分类中类别不平衡问题 5.1 过采样 ...

  9. 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)

    目录 梯度 梯度下降 常用的梯度下降算法(BGD,SGD,MBGD) 梯度下降的详细算法 算法过程 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic ...

最新文章

  1. php面试题11(边看边复习刚刚讲的)(array_multisort($arr1,$arr2); 用$arr1来排序$arr2。)...
  2. JS中window.showModalDialog()详解
  3. 博客园的祥和需要大家共同努力
  4. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...
  5. PAIP.MYSQL设置远程账户登陆总结
  6. Windows PowerShell命令大全
  7. android自定义壁纸制作,如何为Android制作自己的自定义壁纸 | MOS86
  8. 在Mac上将移动磁盘格式化为FAT32分区
  9. 第三章 准备工作 极值点
  10. Word怎么在空白处添加下划线
  11. 把tif文件转化成jpg格式报错已解决
  12. HTC Vive Pro eye 眼动数据简单获取
  13. 计算机管理器鼠标不见了怎么办,电脑的鼠标光标消失了
  14. torch 显存管理
  15. 打开计算机显示服务器失败,win10系统打开windows Media player提示服务器运行失败的详细步骤...
  16. java安全体系:JCA、JCE、JSSE、JAAS
  17. erlang使用httpc:request报错nxdomain
  18. 记一次拿webshell踩过的坑(如何利用PHP编写一个不包含数字和字母的后门)
  19. google收购了recapcha?
  20. linux hdmi输出快捷键,Linux下的投影仪HDMI输出设置

热门文章

  1. java创建线程的两种方法是_java创建线程的两种方法
  2. dijkstra邻接表_[力扣743] 带权邻接表的单源最短路
  3. verilog赋多位值_Verilog入门学习笔记——第一弹
  4. ae制作小球轨迹运动_关于3D建筑漫游动画制作流程及技术详解
  5. liunx 加入域控_[整理篇]linux加入windows域之完美方案
  6. halcon窗体的移动和缩放_halcon与C#联合编程之鼠标控制图片缩放,拖动,roi
  7. LiteIDE调试工具delve
  8. 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
  9. tomcat组播实现session一致性_java会话技术-Session
  10. oracle多少钱一套_消防水炮多少钱一套?您真的只需要一套吗