惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Vulnerabilities – Threatpost
有赞技术团队
有赞技术团队
小众软件
小众软件
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
Hacker News: Ask HN
Hacker News: Ask HN
D
Docker
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
Google Developers Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
GRAHAM CLULEY
S
Schneier on Security
T
Tor Project blog
Spread Privacy
Spread Privacy
PCI Perspectives
PCI Perspectives
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
L
Lohrmann on Cybersecurity
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Exploit Database - CXSecurity.com
TaoSecurity Blog
TaoSecurity Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
T
Troy Hunt's Blog
罗磊的独立博客

Maxwell_Leiの小窝

送给师弟师妹最好的礼物!全组文献自由就靠这个脚本了 大数据成矿预测系列(九) | 数据的“自我画像”:自编码器如何实现非监督下的“特征学习” 大数据成矿预测系列(八) | 从定性到概率:逻辑回归——地质统计学派的“集大成者” 大数据成矿预测系列(七) | 经典模型的“孪生兄弟”:信息量法 (IVM) 深度解析 大数据成矿预测系列(六) | 从“看图像”到“读结构”:GCN如何赋能地质“图谱”推理 你的模型在“作弊”吗?深度解析机器学习中“数据泄露”的隐蔽陷阱 大数据成矿预测系列(五) | 告别特征工程:卷积神经网络(CNN)如何实现“端到端”成矿预测 大数据成矿预测系列(四) | 成矿预测的“主力军”:随机森林与支持向量机深度解析 大数据成矿预测系列(三) | 从统计模型到机器学习:为何机器学习是成矿预测的新前沿? 大数据成矿预测系列(二) | 证据权重法如何克服自身局限? 大数据成矿预测系列(一) | 经典模型“证据权重法”的前世今生 岭回归和 Lasso回归 卷积神经网络设计指南:从理论到实践的经验总结 因子分析基础指南:原理、步骤与地球化学应用解析 科研绘图神器推荐:轻松画出专业神经网络结构图 地球化学数据的封闭效应 提升成矿预测模型的关键:深度学习数据增强技术指南 蒙特卡洛方法 【sklearn】常见监督分类算法实战
深度学习入门概要
Maxwell Lei · 2023-11-28 · via Maxwell_Leiの小窝

前言

论文进行到了深度学习的相关部分,尤其是当下火热的 CV(计算机视觉)的部分,写到如此我的论文部分也就是开始的地方了,这部分并不会涉及 Pytorch 框架的安装以及基础的 Python 问题,关于这个问题可以参考 【sklearn】机器学习环境搭建,Python 的部分可以参考 Python

深度学习框架

深度学习框架可以理解为一种工具,就像是现实中的锤子一样,它可以帮助我们更快速方便的捶打一些东西,当然你也可以选择使用别的什么东西来捶打,而这个使用的工具就是不同的深度学习框架,你甚至可以不使用深度学习的框架,完全自己弄的话也是可以的,只不过这个效率上来说会慢很多。

深度学习框架帮助我们封装了很多方法,屏蔽了很多我们不需要关注的细节,例如,求偏导,反向传播等。也许你看到这里并不是很明白这些词是什么意思,并不要紧,慢慢来做下去就会明白了。

全世界最为流行的深度学习框架有PaddlePaddle、Tensorflow、Caffe、Theano、MXNet、Torch和PyTorch。

斜体内容来源:百度百科

在现在来说,主流的只有两大框架:Tensorflow 和 PyTorch 。在工业界 Tensorflow 使用会比较多,而 PyTorch 使用在学术界的相对会多一些。如果你是研究生的生活中,可以先学习 PyTorch 然后再学习 Tensorflow,两个框架各有优势和缺点,

  1. TensorFlow 的优势:

    • 丰富的生态系统:其全面的库和工具将 TensorFlow 定位为机器学习任务的整体解决方案。
    • 多功能性:它的兼容性扩展到各种语言,包括 C++、JavaScript 和 Python。
    • TensorBoard:一个直观的工具,提供可视化,简化了神经网络的检查和调试。
  2. PyTorch 的优势:

    • 以用户为中心:其以 Python 为中心的特性确保了与Python 代码的无缝集成,使其对数据科学家极具吸引力。
    • 动态计算图:PyTorch 对动态计算图的支持允许对模型进行实时调整。
    • 轻松的多 GPU 支持:使用 PyTorch,数据并行和计算任务的分配变得简单。

接下来将使用一元线性回归来举例,介绍和说明一些深度学习的基础思想和概念说明;

一元线性回归

阅读这部分内容默认你已经有了高等数学基础Python基础

首先,如果你一时间想不起来什么是一元线性回归,如下图所示,你会发现这是你经常接触且熟悉的例子:

image-20231128105945147

图片来源:百度百科-解释变量

好的,现在你应该大概理解了什么是一元线性回归,简单来说,使用一条直线来描述一些数据的趋势。现在我们来假设拟合后的直线为:$\Large z(x_1) = w \cdot x_1 + b$ 。现在我们要使得,$\Large Z(x_1) \cong y_1$ 。

其中,$Z(x_1)$ 表示预测值,$x_1$ 表示已知数据,$y_1$ 表示已知数据的实际值。

在一元线性回归的情况下,我们需要通过大量的已知数据,即 $(x_1,y_1)$ 来学习得到 $w$ 和 $b$ 并最终得到预测值 $Z(x_1)$ 。

损失函数

在开始学习之前,我们需要一个函数来衡量我们是否逼近了我们期望的预测值,否则我们并不知道我们有没有达到我们期望的结果,这个函数在深度学习中称为:损失函数Loss Function:是定义在单个样本上的,是指一个样本的误差,度量模型一次预测的好坏)。损失函数的类型有很多种,例如:

  • 绝对值损失函数:$\large L(y,f(x))=|y-f(x)|$
  • 对数损失函数,又称为交叉熵损失函数:$\large loss = -[y \log_a + (1-y) \log_{1-a}]$
  • 均方差损失函数:$\large loss = (a-y)^2$

当然,还有很多其他的损失函数不再一一列举,在一元线性回归中我们使用均方差函数(使用常规的数学方法最小二乘法):$\Large J= \sum_{i=1}^{m} (z(x_1) - y_1)^2 = \sum_{i=1}^{m} (y_i - wx_i -b)^2$ 。该损失函数,尝试找到一条直线使得直线上下的数据到直线的残差平方和最小

梯度下降

现在我们来采用机器学习的思想来计算这个最优的值,在机器学习的思想下也是有均方差函数,但是会稍微有些不同:$\large loss(w,b) = \frac{1}{2} (z_i - y_i)^2$ 。或许你会好奇为什么要加个 $\large \frac{1}{2}$ ,答案上来说是因为在我们求导的时候将会把平方项导数的系数 2 给消去,是为了方便我们计算

现在你或许会好奇为什么要求导,我们来梳理一下整个过程的思路,我们有了能够衡量预测值是否符合我们预期的损失函数,我们有大量的 $(x,y)$ ,现在我们要求参数 $(w,b)$,这个时候其实换一个思想来说,其实 $(w,b)$ 就是我们的变量,而 $(x,y)$ 是我们的参数,我们希望能够将损失函数降低最低,我们需要求损失函数的最小值,而这个最小值是和参数 $(w,b)$ 相关的,也就是求损失函数关于参数 $(w,b)$ 的偏导,来获得损失函数的极值

现在我们来求损失函数关于 $Z$ 的偏导,也就是求 $Z$ 的梯度:$\Large \frac{\partial{loss}}{\partial{z_{i}}} = z_i - y_i$ 。

现在我们来求损失函数关于 $(w,b)$ 的偏导,来查看 $(w,b)$ 对于损失函数 $loss$ 的影响。

通过求导的链式法则,可以得到 $w$ 的梯度为:$\Large \frac{\partial loos}{\partial w} = \frac{\partial loss}{\partial z_i} \frac{\partial z_i}{\partial w} = (z_i - y_i)x_i$ 。

计算得到 $b$ 的梯度为:$\Large \frac{\partial loos}{\partial b} = \frac{\partial loss}{\partial z_i} \frac{\partial z_i}{\partial b} = z_i - y_i$ 。

反向传播

现在来看剩下的代码片段就可以理解整个过程:

1
2
3
4
5
6
7
8
9
10
//学习率,或者说梯度下降的每次步长
eta = 0.1
//初始化w,b的值
w,b = 0.0,0.0
//按迭代次数进行训练
for i in range(num_train):
//省略计算求导的方法
//更新 w,b 的参数,反向传播
w = w - eta * dw
b = b - eta * db

现在你应该可以理解整个公式过程,通过很多次的迭代来逼近最优解,即损失函数的最小值

使用 Pytorch 实现

在使用这部分示例代码之前,请确保已经成功安装好了 Pytorch 框架和 CUDA 环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import numpy as np


x = np.arange(1, 12, dtype=np.float32).reshape(-1, 1)
y = 2 * x + 3

import torch
import torch.nn as nn



class LinearRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
super().__init__()
self.linear = nn.Linear(input_dim, output_dim)


def forward(self, inp):
out = self.linear(inp)
return out



regression_model = LinearRegressionModel(1, 1)


device = torch.device("cuda:0")
regression_model.to(device)

epochs = 1000
learning_rate = 0.01
optimizer = torch.optim.SGD(regression_model.parameters(), learning_rate)
criterion = nn.MSELoss()
criterion.to(device)

for epoch in range(epochs):

inputs = torch.from_numpy(x).to(device)
labels = torch.from_numpy(y).to(device)


optimizer.zero_grad()
outputs = regression_model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()


if epoch % 50 == 0:
print("epoch:", epoch, "loss:", loss.item())

predict = regression_model(torch.from_numpy(x).to(device).requires_grad_()).cpu().data.numpy()



代码来源:0302-利用pytorch解决线性回归问题,做了小部分修改,修复了一个报错问题

运行结果:

image-20231128172304103

End

这部分内容会让你对深度学习的基本概念和 Pytroch 的使用有一些基本的了解,你或许看不懂相关代码,但是这并不重要,重要的是理解和适应 Pytorch 以及深度学习。

最重要的是要时刻动手去做,才能更深刻的理解。

参考文章