李宏毅机器学习课程笔记01 | 1.Introduction of Machine/Deep Learning
笔记是在语雀上面做的,粘贴在CSND上可能存在格式错误
机器学习的本质就是借助机器寻找一个转换函数
根据函数的输出类型,可以将机器学习进行分类
- regression 回归任务:函数输出时一个数值
- classification 分类任务:人类设定好选项/类别,函数的输出时选项/类别中的一个
- structured learning : 机器创造一些有结构的信息,比如文本、图
过拟合Overfitting
:在训练资料上变好,在没有训练的资料上效果边差
问题1:机器怎么寻找一个转换函数
案例:Youtube频道订阅人数的预测
步骤1:写出一个带有未知参数的函数
猜测其转换函数应该长什么样,这个函数的猜测过程就需要用到领域知识。
猜测:未来点阅次数的函式F,是前一天的点阅次数,乘上w 再加上b
- y y y 是我们要预测的人数
- x 1 x_1 x1是这个频道前一天总共观看的人数
名词定义
Feature: Function裡面我们已知的信息 x 1 x_1 x1
Weight: 未知参数
Bias: 未知参数,偏差值
步骤2:从训练数据里定义Loss损失函数L(b,w)
函数的输入是b和w,函数的输出是输入某个特定的b和w,模型结果是是好还是不好
L越大说明模型不好,L越小说明模型好
假设有一个损失函数L(0.5k,1) ,模型为y=b+wx1 => y=0.5k+1x1(k是千人的意思)
训练数据(本案例过去的订阅次数)输入到模型(函数)中,比如x输入1月1日订阅人数4.8k,计算得到模型预测的y(1月2日订阅人数)为5.3k,但实际只有4.9k
计算方法: 求取估测的值跟实际的值(Label) 之间的差距
本案例中e取绝对值的方法称为mean absolute error(MAE)平均绝对误差
e=(y-y预测)2称为mean square error(MSE)均方误差
如果y与y预测都是概率分布,可能选择的e为coss-entropy交叉熵
步骤3:optimization
优化 让Loss值最小
优化式:w*,b* = arg m i n w , b \underset {w,b}{min} w,bminL,寻找参数w和b让L最小,将其称为w和b。
本课程用到的Gradient Descent
梯度下降方法
-
随机选取初始值:假设只有一个参数w,随机选择一个初始点w0
-
计算 ∂ L ∂ W ∣ w = w 0 {\frac{\partial L}{ \partial W}}|_{w=w^0} ∂W∂L∣w=w0
-
根据微分(梯度)的方向,改变参数的值,优化的目标是降低损失值。
-
根据微分(梯度)的方向,改变参数的值–应该降低w还是提升w取值?
①如果计算出来斜率为负,说明该点w0 处损失值L呈下降趋势,因此增加w就可以获取到更低的L值
②同理如果计算出来斜率为正,说明损失值L呈上升趋势,因此降低w值可以获取到更低的L值
w改变的跨度取决于斜率的大小与学习率的大小,移动跨度公式: η ∂ L ∂ W ∣ w = w 0 \eta{\frac{\partial L}{ \partial W}}|_{w=w^0} η∂W∂L∣w=w0
①斜率大说梯度大损失值改变大可以大幅度降低w。
② η \eta η表示学习速率 ,该值自己设置,在机器学习中,自己设置的固定值称为hyperparameters超参数
-
-
新的w1 = w0- η ∂ L ∂ W ∣ w = w 0 \eta{\frac{\partial L}{ \partial W}}|_{w=w^0} η∂W∂L∣w=w0 ,重复操作2和操作3不断更新w的取值
-
什么时候停下来
- 自己设置上限,这个上限也是一个超参数。比如设置更新w 1000次。
- 理想情况:微分值为0(极小值点),不会再更新
梯度下降存在问题:有可能陷入局部最小值,不能找到全局最小值 (事实上,局部最小值不算梯度下降真正的痛点)
问题:为什么损失值可以取负数?
估测的值y跟实际的值(Label) 之间的差距在本案例中是取绝对值,不可能有负数。这里图是随便画的和本案例无关
推广到多个参数 => 类似一个参数的做法
不断更新参数,直到找到一个 w 和 b
模型的修改
利用模型预测未知日期新的观看量,发现每个7天一个循环(周一到周四观看量高,周五到周六观看量低,周末观看量增加)
原来的模型只能依据前一天的值预测当天值(随便猜测y=b+wx1),根据上图我们发现其实观看人数呈周期变化,这里猜测采用上周值预测本周值可以得到更精准的模型(对问题有了更深的理解)。
修改新模型为 y = b + ∑ j = 1 7 w j x j y=b+{\sum_{j=1}^7}{w_j}{x_j} y=b+∑j=17wjxj,下标j表示根据前7天的观看人次,预测当天的观看人次=> 也可以考虑更多天的观看人次
相当于将一个特征值x1 (w同)增加到了7个特征值x 1~7
神经网络
线性模型
linear models =Feature*Weight + bias
=> 不是要一模一样,在模型修改中的 y = b + ∑ j = 1 7 w j x j y=b+{\sum_{j=1}^7}{w_j}{x_j} y=b+∑j=17wjxj也是线性模型
线性模型存在严重限制Model Bias
(跟前面说的变量b bias意思不同):y只会随x1线性变化 ⇒ 解决方法:需要一个更复杂的、有未知参数的function
Sigmoid Function改写步骤1:写出一个带有未知参数的函数
所有Piecewise Linear Curves
分段线性曲线( 定义:由多段锯齿状的线段所组成的线 )= 常数 + 一大堆蓝色function(每一段的蓝色function可能不一样,下述案例只是举例)
=> 可以用Piecewise Linear Curves
逼近任何连续曲线
在案例Youtube频道订阅人数的预测
中,即使x和y的关系很复杂,但我们感觉应该还是一条连续曲线,所以只要想办法写一个带有未知数的function(常数+一堆蓝色function )
并不知道如何写出这个function,使用Sigmid Function Curves
来逼近这个function
Sigmoid Function
(S形函数): y = c 1 1 + e − ( b + w x 1 ) y = c\frac{1}{{1+e^{-(b+wx_1)}}} y=c1+e−(b+wx1)1
调整 w , b , c w,b,c w,b,c,可以得到各种不同的sigmiod来逼近”蓝色function“,通过求和,最终近似各种不同的连续Function
总结
- 用
Piecewise Linear Curves
逼近任何连续曲线,Piecewise Linear Curves
= 常数 + 一大堆蓝色function,所以需要表示蓝色function(但是并不清楚怎么表示)。 - 使用
Sigmid Function Curves
(可以表示任何连续曲线)通过调整来$ w,b,c $逼近这个蓝色function。
案例理解
套入这个本课程的案例,模型可以表示为$ y=b+\sum_isigmoid(b_i+w_ix_1) $(当天的观看人数和前一天的有关)
调整 b 、 w 、 c b、w、c b、w、c可以制造不同的蓝色function,不同的蓝色function叠加起来就可以制造出不同的Piecewise Linear Curves ,不同的Piecewise Linear Curves可以去逼近不同的连续函数
前面我们优化过,其实当天的观看人数可以和前几天的有关,模型可以表示为 y = b + ∑ i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j) y=b+∑isigmoid(bi+∑jwijxj)i是不同的function函数数量,j表示当前日期的前j天, w i j w_{ij} wij第i个sigmoid给第j个特征的权重
下面将i和j带入实际例子理解一下,假设这个模型由三个不同的sigmoid function
叠加生成(sigmoid的数量是自己决定的超参数),当天的预测人数与前三天的观看人数有关,也就是j和i分别取1、2、3
转化为线性代数的形式
- 将 b i + ∑ j w i j x j b_i+\sum_jw_{ij}x_j bi+∑jwijxj等价成 r = b ⃗ + 矩阵 W ∗ x r = \vec{b} + 矩阵W*x r=b+矩阵W∗x形式
- a = s i g m o i d ( r ) = 1 1 + e − r = σ ( r ) a = sigmoid(r)=\frac1{1+e^{-r}}=\sigma(r) a=sigmoid(r)=1+e−r1=σ(r),将a的表示简写为 σ ( r ) \sigma(r) σ(r)
- 模型线性代数的表达为 y = 常数 b + c T a = 常数 b + c T σ ( r ) = 常数 b + c T σ ( b ⃗ + 矩阵 W ∗ x ⃗ ) y=常数b+c^Ta=常数b+c^T\sigma(r)=常数b+c^T\sigma(\vec{b}+矩阵W*\vec{x}) y=常数b+cTa=常数b+cTσ(r)=常数b+cTσ(b+矩阵W∗x)
公式中x为feature 未知参数为矩阵W、常数b、 b ⃗ \vec{b} b 、 c T c^T cT,一般将矩阵W每一行/列抽出来与其他向量拼在一起,将所有的参数统称为 θ \theta θ.(包含 W, b ⃗ \vec{b} b ,b…)
第二步:定义Loss损失函数L( θ \theta θ)
因为所有的参数统称为 θ \theta θ,所以Loss表示为 L ( θ ) L(\theta) L(θ)。
输入x求计算出来的 y = b + c T σ ( b ⃗ + 矩阵 W ∗ x ⃗ ) y=b+c^T\sigma(\vec{b}+矩阵W*\vec{x}) y=b+cTσ(b+矩阵W∗x),还是利用平均绝对误差法计算与真实label y ^ \hat{y} y^的误差绝对值 e = ∣ y − y ^ ∣ e=|y-\hat{y}| e=∣y−y^∣,损失函数 L = 1 N ∑ n e n L=\frac{1}{N}\sum_n{e_n} L=N1∑nen
第三步:optimization优化 找到参数使L最小
- 选定初始参数值(向量) θ 0 \theta_0 θ0
- 对每个参数求偏导/微分,每个参数求偏导组成的矩阵叫做
gradient
梯度有些时候简写为` ∇ \nabla ∇, ∇ L ( θ 0 ) \nabla{L}(\theta^0) ∇L(θ0) - 更新参数,直至设定的次数
批训练Batch training
实际上, 不会一次性将全部数据用于训练一个L,而是将全部资料分成n个batch(这里的n也是一个超参数)去训练n个L。
定义
- 1 epoch 时期= 使用所有batch的L更新一次 θ \theta θ
- 1 update/iteration = 每更新一次参数 θ \theta θ
比如有资料N=10000,每个batch划分的资料是100,那么一共有100个batch,一次epoch里会更新100次 θ \theta θ
问题:为什么要将全部资料分成一个一个batch
todo
模型的其他变形
使用Rectified Linear Unit线性整流单元
在上述案例中,我们是将蓝色function(hard sigmoid)近似为<font style="color:#DF2A3F;">(soft)sigmoid function</font>
,其实这里还有其他的做法。
比如:每一个hard sigmoid
可以使用两个线性整流单元Rectified Linear Unit
(ReLU)叠加
图形上的表示为一个折线(两个水平线有一个转折点),公式表示为 c max ( 0 , b + w x 1 ) c\max(0,b+wx_1) cmax(0,b+wx1),上述的模型 y = b + ∑ i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j) y=b+∑isigmoid(bi+∑jwijxj)可表示为 y = b + ∑ 2 i m a x ( 0 , b i + ∑ j w i j x j ) y=b+\sum_{2i}max(0,b_i+\sum_jw_{ij}x_j) y=b+∑2imax(0,bi+∑jwijxj),其中i表示函数的条数,1个hard sigmoid需要用2个relu函数叠加而成
:::tips
这里的sigmoid和Relu在机器学习中被称为Activation funtion激活函数
:::
问题:哪一个激活函数效果更好
todo
增加嵌套层数
生成a后,可以嵌套生成a’,这里的嵌套次数是一个超参数
问题:为什么可以这样做,这样做的原因是什么
这里感觉没讲明白
我的理解:从图像来讲a表示的是一个s型曲线(c只影响高度),将一个hard sigmoid逼近为一个sigmoid。那再做一次表示再逼近一次?
Deep Learning
以前的叫法:这些sigmoid或者Relu被叫做一个neuron
神经元,很多neurl被叫做Neural Network
神经网络
现在的叫法:每一排Neural
叫做一个hidden layer
,很多hidden layer
被叫做Deep
,这一套技术被叫做Deep Learning
深度学习
相关文章:

李宏毅机器学习课程笔记01 | 1.Introduction of Machine/Deep Learning
笔记是在语雀上面做的,粘贴在CSND上可能存在格式错误 机器学习的本质就是借助机器寻找一个转换函数 根据函数的输出类型,可以将机器学习进行分类 regression 回归任务:函数输出时一个数值classification 分类任务:人类设定好选项…...

1、pycharm、python下载与安装
1、去官网下载pycharm 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间,去下载python 进入官网地址:https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…...

计算机网络复习(学习通作业4、5、6系统答案)
📢📢📢传送门 一、作业4一. 计算题(共1题,100分) 二、作业5一. 简答题(共1题,30分)路由器属于那一层的互联设备?路由器结构包含哪两个部分?请解释…...

javascript 绘制图表的几种方式
JavaScript 中,绘制图表的常用方法是使用图表库,它们提供了便捷的 API 和功能来实现图形和数据可视化。以下是几种常见的 JavaScript 图表绘制库以及如何使用它们来绘制图表的示例: 1. Chart.js Chart.js 是一个轻量级、简单易用的图表库,支持多种图表类型,如线性图、柱…...

【网络协议】开放式最短路径优先协议OSPF详解(四)
前言 在本章的第一部分和第二部分中,我们探讨了OSPF的基本配置,并进一步学习了更多OSPF的概念,例如静态路由的重分发及其度量值。在第三部分中,我们讨论了多区域OSPF。在第四部分中,我们将关注OSPF与多访问网络&#…...

C++STL中algorithm的介绍与使用
C STL中的<algorithm>库提供了一组模板函数,用于操作序列(如数组、向量等)。以下是一些常用的<algorithm>函数的详细介绍、使用方式和示例,以及在竞赛过程中的一些细节。 1. 非修改性算法 std::find 概念ÿ…...

Oracle exp和imp命令导出导入dmp文件
目录 一. 安装 instantclient-tools 工具包二. exp 命令导出数据三. imp 命令导入数据四. expdp 和 impdp 命令 一. 安装 instantclient-tools 工具包 ⏹官方网站 https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html ⏹因为我们在…...

GitLab集成Runner详细版--及注意事项汇总【最佳实践】
一、背景 看到网上很多用户提出的runner问题其实实际都不是问题,不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner,因为这类文章写得好的特别多,本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…...

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代
2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…...

网络安全:路由技术
概述 路由技术到底研究什么内容 研究路由器寻找最佳路径的过程 路由器根据最佳路径转发数据包 知识点,重要OSRF,BGP1.静态路由原理 路由技术分类 静态路由和动态路由技术 静态路由:是第一代路由技术,由网络管理员手工静态写路由/路径告知路…...

Vue3 子组件向父组件传递消息(Events)
子组件向父组件传递消息(Events) 子组件可以通过 $emit 触发事件,父组件可以监听这些事件并作出响应。 子组件: <template><button click"sendMessage">Send Message to Parent</button> </tem…...

如何清理Docker的overlay2目录下的文件
清理 Docker 的 overlay2 目录下的文件需要谨慎操作,因为这些文件通常是容器的存储层,直接删除可能会导致容器无法正常运行或数据丢失。以下是清理 overlay2 目录的步骤和建议: 1. 确认文件是否可以被清理 在清理之前,确认 c7ffc13c49a43f08ef9e234c6ef9fc5a3692deda3c5d4…...

《Vue3实战教程》19:Vue3组件 v-model
如果您有疑问,请观看视频教程《Vue3实战教程》 组件 v-model 基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏: vue <!-- Child.vue --> <script setup> co…...

数字PWM直流调速系统设计(论文+源码)
2.1 系统方案设计 2.2.1开环控制方案 采用开环方案的系统架构如图2.1所示,这种方式不需要对直流电机的转速进行检测,在速度控制时单片机只需要直接发出PWM就可以实现直流电机速度的控制。这种方式整体设计难度较低,但是无法准确得知当前的…...

Spring Boot日志处理
文章目录 Spring Boot日志处理1. 日志存入数据库(AOP)2. 日志控制台打印与写入文件(logback) Spring Boot日志处理 1. 日志存入数据库(AOP) 引入aop依赖 <dependency><groupId>org.springfram…...

vue3+Echarts+ts实现甘特图
项目场景: vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…...

OpenCV相机标定与3D重建(41)从 3D 物点和它们对应的 2D 图像点估算初始相机内参矩阵函数initCameraMatrix2D()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从3D-2D点对应关系中找到一个初始的相机内参矩阵。 cv::initCameraMatrix2D 是 OpenCV 库中的一个函数,用于从 3D 物点和它们对应的…...

ELK日志平台搭建 (最新版)
一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包: sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…...

智能化人才招聘系统是怎样的?
随着企业规模的扩大和业务范围的拓展,人才招聘成为了企业发展的关键环节。然而,市面上的人才招聘系统琳琅满目,质量参差不齐,许多企业发现,并非所有系统都能满足他们的需求,特别是智能化的需求。今天&#…...

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教
0 缘起 一台联想电脑,使用Windows 10 专业版32位,电脑主机后置音频插孔一直没有声音,所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线,音频线头断在音频插孔里面了,前置音频插孔因此用不…...

记一次音频无输出的解决方案
啊啊啊,刷个抖音就发现个死电脑死都不出声,捣鼓了一天才解决 打开wav文件时,提示错误找不到音频播放设备 0xc00d36fa 起初以为是声卡坏了,就到官网下载、更新了声卡驱动。无用什么驱动精灵也检测了,但也测不出啥来。…...

初学stm32 --- FSMC驱动LCD屏
目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序: FSMC地址映射 HADDR与FSMC_A关系 LCD的…...

Scala_【4】流程控制
第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…...

mysql带自动递增列的表删除数据后如何重置递增值
mysql带自动递增列的表删除数据后如何重置递增值 在 MySQL 中,如果你删除了表中的数据,自动递增列的值 不会自动重置。如果你希望在删除数据后重新设置自动递增列的值,可以使用以下几种方法: 1. 使用 ALTER TABLE 重置自动递增值…...

[CTF/网络安全] 攻防世界 simple_php 解题详析
题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 代码解读 $a$_GET[a]; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b$_GET[b];…...

Android 第三方框架:网络框架:OkHttp:源码分析:缓存
文章目录 概述磁盘缓存 类结构 InternalCache接口DiskLruCahce.Entry内部类DiskLruCahce.Snapshot内部类DiskLruCahce.Editor内部类DiskLruCahce类Cahce.Entry内部类Cahce类总结概述 不存在内存缓存,只存在磁盘缓存 磁盘缓存 磁盘缓存 类结构 主要InternalCache接口、Dis…...

大数据新视界 -- Hive 集群搭建与配置的最佳实践(2 - 16 - 13)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

C# 设计模式(结构型模式):组合模式
C# 设计模式(结构型模式):组合模式 在软件设计中,有时我们需要处理的是一组对象,而这些对象既可以是单独的元素,也可以是由多个子元素组成的复合体。这时,组合模式(Composite Patte…...

Aloudata AIR | 逻辑数据平台的 NoETL 之道
一文为你介绍 Aloudata AIR 逻辑数据平台的技术原理与核心价值 本文主旨是介绍逻辑数据平台的技术原理与核心价值,包含几个部分的内容: 首先,简要阐述逻辑数据平台出现的背景;其次,详细讲解逻辑数据平台的构建方法&am…...

js的一些处理
1.翻转字符串 let str abcdef str str.split().reverse().join() console.log(str) 因此想到了我之前写的截取字符串获取参数跳转,在写一遍 let str nameJack&age18&gender男 let list str.split(&); let obj {} list.forEach((v)>{ …...