第一门课:神经网络和深度学习(第二周)——神经网络的编程基础

2023-10-14 22:30

本文主要是介绍第一门课:神经网络和深度学习(第二周)——神经网络的编程基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

神经网络的编程基础

  • 1. 二分类
  • 2. 逻辑回归
  • 3. 逻辑回归的代价函数
  • 4. 梯度下降法
  • 5. 导数
  • 6. 计算图的导数计算
  • 7. 逻辑回归中的梯度下降(※)
  • 8. m个样本的梯度下降
  • 9. 向量化
  • 10. 向量化的更多例子
  • 11. 向量化 logistic 回归
  • 12. 向量化 logistic 回归梯度输出
  • 13. numpy 广播机制
  • 14. 关于 python / numpy 向量的说明

1. 二分类

  • 什么是二分类问题呢——举个栗子,给你一张图片,判断图片中动物是不是猫?
    在这里插入图片描述

对于图像处理问题,每个图片由很多像素点组成。所以图片的特征向量是3通道的RGB矩阵,我们将其展平作为一个特征输入向量 x x x

约定一些符号:
x x x:表示一个 n x n_x nx维数据,为输入数据,维度为( n x n_x nx,1);
y y y:表示输出结果,取值为(0,1);
( x i x^i xi y i y^i yi):表示第 i i i 组数据,可能是训练数据,也可能是测试数据,此处默认为训练数据;

X = [ x ( 1 ) , x ( 2 ) , . . . , x ( m ) ] X=[x^{(1)},x^{(2)},...,x^{(m)}] X=[x(1),x(2),...,x(m)]:表示所有的训练数据集的输入值,放在一个 n x × m n_x×m nx×m的矩阵中,其中 m m m表示样本数目;
Y = [ y ( 1 ) , y ( 2 ) , . . . , y ( m ) ] Y=[y^{(1)},y^{(2)},...,y^{(m)}] Y=[y(1),y(2),...,y(m)]:对应表示所有训练数据集的输出值,维度为 1 × m 1×m 1×m

2. 逻辑回归

对于二元分类问题来讲,给定一个输入特征向量 X X X,它可能对应一张图片,你想识别图片内容是否为一只猫,你需要算法能够输出预测 y ^ \hat{y} y^ y ^ \hat{y} y^ 表示 y y y 等于1的一种可能性或者是概率。

前提条件给定了输入特征 X X X X X X是一个 n x n_x nx维的向量(相当于有 n x n_x nx个特征的特征向量)。我们用 w w w来表示逻辑回归的参数,这也是一个 n x n_x nx维向量(因为 w w w特征权重,维度与特征向量相同),参数里面还有 b b b,这是一个表示偏差的实数。

所以给出输入 x x x以及参数 w w w b b b之后,我们怎样产生输出预测值 y ^ \hat{y} y^?
y ^ = w T x + b \hat{y}={{w}^{T}}x+b y^=wTx+b 这样么? 答案是否定的。

我们需要借助sigmoid函数,令 y ^ = σ ( z ) = 1 1 + e − z \hat{y}=\sigma \left( z \right)=\frac{1}{1+{{e}^{-z}}} y^=σ(z)=1+ez1,其中 z = w T x + b z={{w}^{T}}x+b z=wTx+b
我认为此定义原因如下:1. 为了便于解释 y ^ \hat{y} y^存在的意义,以概率形式出现更易于接受;2. 为了便于接下来代价函数的提出和理解。

3. 逻辑回归的代价函数

为了衡量一个算法在模型上的表现并以此作为优化的依据,我们需要一个代价函数。在逻辑回归中,我们需要通过训练代价函数来得到优化后的参数 w w w和参数 b b b

Loss function: L ( y ^ , y ) = − ( y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ) L\left( \hat{y},y \right)=-(y\log(\hat{y})+(1-y)\log (1-\hat{y})) L(y^,y)=(ylog(y^)+(1y)log(1y^)),交叉熵损失函数,常用于二分类问题。

  • 所有的样本的损失函数的平均值
    J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( y ^ ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) ] J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \left(\hat{y}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right] J(w,b)=m1i=1mL(y^(i),y(i))=m1i=1m[y(i)log(y^(i))+(1y(i))log(1y^(i))]

目标就是找到合适的参数,使得代价函数最小化

4. 梯度下降法

如何寻找合适的 w , b w, b w,b 使得代价函数最小呢?
迭代的过程中,不断的在各参数的偏导数方向上更新参数值, α \alpha α 是学习率
w : = w − α ∂ J ( w , b ) ∂ w b : = b − α ∂ J ( w , b ) ∂ b \begin{aligned} &w:=w-\alpha \frac{\partial J(w, b)}{\partial w} \\ &b:=b-\alpha \frac{\partial J(w, b)}{\partial b} \end{aligned} w:=wαwJ(w,b)b:=bαbJ(w,b)

5. 导数

导数定义:函数在某一点的斜率,在不同的点,斜率可能是不同的。

6. 计算图的导数计算

链式求导法则:
在这里插入图片描述

7. 逻辑回归中的梯度下降(※)

假设函数和损失函数
z = w T x + b y ^ = a = σ ( z ) L ( a , y ) = − ( y log ⁡ ( a ) + ( 1 − y ) log ⁡ ( 1 − a ) ) \begin{aligned} &z=w^{T} x+b \\ &\hat{y}=a=\sigma(z) \\ &\mathcal{L}(a, y)=-(y \log (a)+(1-y) \log (1-a)) \end{aligned} z=wTx+by^=a=σ(z)L(a,y)=(ylog(a)+(1y)log(1a))
sigmoid 函数 f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1
sigmoid 求导:
f ( z ) ′ = ∂ f ( z ) ∂ z = − 1 ∗ − 1 ∗ e − z ( 1 + e − z ) 2 = e − z ( 1 + e − z ) 2 = 1 + e − z − 1 ( 1 + e − z ) 2 = 1 1 + e − z − 1 ( 1 + e − z ) 2 = 1 1 + e − z ( 1 − 1 1 + e − z ) = f ( z ) ( 1 − f ( z ) ) \begin{aligned} f(z)^{'}=\frac{\partial f(z)}{\partial z} &=\frac{-1 *-1 * e^{-z}}{\left(1+e^{-z}\right)^{2}} \\ &=\frac{e^{-z}}{\left(1+e^{-z}\right)^{2}} \\ &=\frac{1+e^{-z}-1}{\left(1+e^{-z}\right)^{2}} \\ &=\frac{1}{1+e^{-z}}-\frac{1}{\left(1+e^{-z}\right)^{2}} \\ &=\frac{1}{1+e^{-z}}\left(1-\frac{1}{1+e^{-z}}\right) \\ &=f(z)(1-f(z)) \end{aligned} f(z)=zf(z)=(1+ez)211ez=(1+ez)2ez=(1+ez)21+ez1=1+ez1(1+ez)21=1+ez1(11+ez1)=f(z)(1f(z))
在这里插入图片描述
求导过程
∂ L ∂ a = − y a + 1 − y 1 − a named  " d a " ∂ L ∂ z = ∂ L ∂ a ∂ a ∂ z = ( − y a + 1 − y 1 − a ) ∗ a ( 1 − a ) = a − y named  " d z " ∂ L ∂ w 1 = ∂ L ∂ z ∂ z ∂ w 1 = x 1 ( a − y ) named  " d w 1 " ∂ L ∂ w 2 = ∂ L ∂ z ∂ z ∂ w 2 = x 2 ( a − y ) named  " d w 2 " ∂ L ∂ b = ∂ L ∂ z ∂ z ∂ b = a − y named  " d b " \begin{aligned} \frac{\partial \mathcal{L}}{\partial a} &=-\frac{y}{a}+\frac{1-y}{1-a} \quad \text { named } \quad "da"\\ \frac{\partial \mathcal{L}}{\partial z} &=\frac{\partial \mathcal{L}}{\partial a} \frac{\partial a}{\partial z}=\left(-\frac{y}{a}+\frac{1-y}{1-a}\right) * a(1-a)=a-y \quad \text { named } \quad "dz"\\ \frac{\partial \mathcal{L}}{\partial w_{1}} &=\frac{\partial \mathcal{L}}{\partial z} \frac{\partial z}{\partial w_{1}}=x_{1}(a-y) \quad \text { named } \quad "dw_{1}" \\ \frac{\partial \mathcal{L}}{\partial w_{2}} &=\frac{\partial \mathcal{L}}{\partial z} \frac{\partial z}{\partial w_{2}}=x_{2}(a-y) \quad \text { named } \quad "dw_{2}" \\ \frac{\partial \mathcal{L}}{\partial b} &=\frac{\partial \mathcal{L}}{\partial z} \frac{\partial z}{\partial b}=a-y \quad \text { named } \quad "db" \end{aligned} aLzLw1Lw2LbL=ay+1a1y named "da"=aLza=(ay+1a1y)a(1a)=ay named "dz"=zLw1z=x1(ay) named "dw1"=zLw2z=x2(ay) named "dw2"=zLbz=ay named "db"
迭代更新
w 1 : = w 1 − α ∗ d w 1 w 2 : = w 2 − α ∗ d w 2 b : = b − α ∗ d b \begin{aligned} w_{1}:&=w_{1}-\alpha * d w_{1} \\ w_{2}:&=w_{2}-\alpha * d w_{2} \\ b:&=b-\alpha * db \end{aligned} w1:w2:b:=w1αdw1=w2αdw2=bαdb

8. m个样本的梯度下降

假设有m个样本,每个样本有2个特征

// 伪代码 from http://www.ai-start.com/dl2017/html/lesson1-week2.html
J=0; dw1=0; dw2=0; db=0;
for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw1 += x1(i)dz(i); // 全部样本的梯度累加dw2 += x2(i)dz(i);db += dz(i);// 求平均值
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db

显式的使用 for 循环是很低效的,要使用向量化技术加速计算速度。

9. 向量化

使用 numpy 等库实现向量化计算,效率更高

import numpy as np #导入numpy库
a = np.array([1,2,3,4]) #创建一个数据a
print(a)
# [1 2 3 4]
import time #导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000) #通过round随机得到两个一百万维度的数组tic = time.time() #现在测量一下当前时间
#向量化的版本
c = np.dot(a,b)
toc = time.time()
print(c)
print('Vectorized version:' + str(1000*(toc-tic)) +'ms') #打印一下向量化的版本的时间#继续增加非向量化的版本
c = 0
tic = time.time()
for i in range(1000000):c += a[i]*b[i]
toc = time.time()
print(c)
print('For loop:' + str(1000*(toc-tic)) + 'ms')#打印for循环的版本的时间

上面例子,向量化计算快了600多倍

250241.79388712568
Vectorized version:0.9975433349609375ms
250241.7938871326
For loop:687.734842300415ms

10. 向量化的更多例子

J=0; db=0;
dw = np.zeros((nx,1)) // numpy向量化
for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw += x(i)dz(i); // 向量化,全部样本的梯度累加db += dz(i);// 求平均值
J /= m;
dw /= m;// 向量化
db /= m;// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db

这样就把内层的 d w 1 , . . . d w n dw_1,... dw_n dw1,...dwn 的计算使用向量化了,只用1层 for 循环,还可以做的更好,往下看。

11. 向量化 logistic 回归

逻辑回归前向传播步骤:

  • 对每个样本进行计算
    z ( 1 ) = w T x ( 1 ) + b z^{(1)}=w^{T} x^{(1)}+b z(1)=wTx(1)+b
  • 计算激活函数,得到预测值 y ^ \hat{y} y^
    a ( 1 ) = σ ( z ( 1 ) ) a^{(1)} = \sigma(z^{(1)}) a(1)=σ(z(1))
    在这里插入图片描述

可以使用 numpy 来计算:

  • Z = n p . d o t ( w T , X ) + b Z = np.dot(w^T, X)+b Z=np.dot(wT,X)+b,+ b 会对每个元素操作,是 numpy 的广播机制。
  • A = [ a ( 1 ) a ( 2 ) … a ( m ) ] = σ ( Z ) A=\left[a^{(1)} a^{(2)} \ldots a^{(m)}\right]=\sigma(Z) A=[a(1)a(2)a(m)]=σ(Z)

这样就没有显式使用 for 循环,计算非常高效。

12. 向量化 logistic 回归梯度输出

Z = w T X + b = n p ⋅ dot ⁡ ( w . T , X ) + b A = σ ( Z ) d Z = A − Y d w = 1 m ∗ X ∗ d Z T d b = 1 m ∗ n p . sum ⁡ ( d Z ) w : = w − a ∗ d w b : = b − a ∗ d b \begin{aligned} Z&=w^{T} X+b=n p \cdot \operatorname{dot}(w . T, X)+b \\ A&=\sigma(Z) \\ d Z&=A-Y \\ d w&=\frac{1}{m} * X * d Z^{T} \\ d b&=\frac{1}{m} * n p . \operatorname{sum}(d Z) \\ w:&=w-a * d w \\ b:&=b-a * d b \\ \end{aligned} ZAdZdwdbw:b:=wTX+b=npdot(w.T,X)+b=σ(Z)=AY=m1XdZT=m1np.sum(dZ)=wadw=badb

非向量化、向量化对比:

在这里插入图片描述
这样就向量化的计算,完成了逻辑回归的 1 次迭代,要完成 n_iter 次迭代就在外层加一层 for 循环,这个 for 是省不了的。

13. numpy 广播机制

import numpy as npA = np.array([[56, 0, 4.4, 68],[1.2, 104, 52, 8],[1.8, 135, 99, 0.9]
])cal = A.sum(axis=0)  # 按列求和
print(cal)percentage = 100 * A / cal.reshape(1, 4)
print(percentage)
[ 59.  239.  155.4  76.9]
[[94.91525424  0.          2.83140283 88.42652796][ 2.03389831 43.51464435 33.46203346 10.40312094][ 3.05084746 56.48535565 63.70656371  1.17035111]]

注:axis指明运算 沿着哪个轴执行,在numpy中,0轴是垂直的,也就是列,而1轴是水平的,也就是行。

  • 例1
A = np.array([[1, 2, 3, 4]])
b = 100
print(A+b)

在这里插入图片描述

[[101 102 103 104]]
  • 例2
A = np.array([[1, 2, 3],[4, 5, 6]])
B = np.array([100, 200, 300])
print(A+B)

在这里插入图片描述

[[101 202 303][104 205 306]]
  • 例3
A = np.array([[1, 2, 3],[4, 5, 6]])
B = np.array([[100], [200]])
print(A + B)

在这里插入图片描述

[[101 102 103][204 205 206]]
  • 广播机制与执行的运算种类无关
    在这里插入图片描述

14. 关于 python / numpy 向量的说明

在这里插入图片描述

  • 总是使用 nx1 维矩阵(列向量),或者 1xn 维矩阵(行向量);
  • 为了确保所需要的维数时,不要羞于 reshape 操作。

这篇关于第一门课:神经网络和深度学习(第二周)——神经网络的编程基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213567

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学