数值稳定性 + 模型初始化和激活函数
数值稳定性
神经网络的梯度
- 考虑如下有 d 层的神经网络
h t = f t ( h t − 1 ) and y = ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t = f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y = \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) ht=ft(ht−1)andy=ℓ∘fd∘…∘f1(x) - 计算损失 ℓ \ell ℓ 关于参数 W t \mathbf{W}_t Wt 的梯度
∂ ℓ ∂ W t = ∂ ℓ ∂ h d ∂ h d ∂ h d − 1 ⋯ ∂ h t + 1 ∂ h t ∂ h t ∂ W t \frac{\partial \ell}{\partial \mathbf{W}^t} = \frac{\partial \ell}{\partial \mathbf{h}^d} \frac{\partial \mathbf{h}^d}{\partial \mathbf{h}^{d-1}} \cdots \frac{\partial \mathbf{h}^{t+1}}{\partial \mathbf{h}^t} \frac{\partial \mathbf{h}^t}{\partial \mathbf{W}^t} ∂Wt∂ℓ=∂hd∂ℓ∂hd−1∂hd⋯∂ht∂ht+1∂Wt∂ht
这里 ∂ h d ∂ h d − 1 ⋯ ∂ h t + 1 ∂ h t \frac{\partial \mathbf{h}^d}{\partial \mathbf{h}^{d-1}} \cdots \frac{\partial \mathbf{h}^{t+1}}{\partial \mathbf{h}^t} ∂hd−1∂hd⋯∂ht∂ht+1 表示 d − t d-t d−t 次矩阵乘法,这也是主要问题来源,因为这里做了太多的矩阵乘法。
数值稳定性的常见的两个问题
下面展示一个简单的例子来看一下上述两种情况是如何产生的:
加入如下 MLP (为了简单省略了偏移)
- f t ( h t − 1 ) = σ ( W t h t − 1 ) σ f_t(\mathbf{h}^{t-1}) = \sigma(\mathbf{W}^t \mathbf{h}^{t-1}) \quad \sigma ft(ht−1)=σ(Wtht−1)σ 是激活函数
∂ h t ∂ h t − 1 = diag ( σ ′ ( W t h t − 1 ) ) ( W t ) T σ ′ 是 σ 的导数函数 \frac{\partial \mathbf{h}^t}{\partial \mathbf{h}^{t-1}} = \text{diag}(\sigma'(\mathbf{W}^t \mathbf{h}^{t-1})) (\mathbf{W}^t)^T \quad \sigma' \text{ 是 } \sigma \text{ 的导数函数} ∂ht−1∂ht=diag(σ′(Wtht−1))(Wt)Tσ′ 是 σ 的导数函数 ∏ i = t d − 1 ∂ h i + 1 ∂ h i = ∏ i = t d − 1 diag ( σ ′ ( W i h i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1} \frac{\partial \mathbf{h}^{i+1}}{\partial \mathbf{h}^i} = \prod_{i=t}^{d-1} \text{diag}(\sigma'(\mathbf{W}^i \mathbf{h}^{i-1})) (\mathbf{W}^i)^T i=t∏d−1∂hi∂hi+1=i=t∏d−1diag(σ′(Wihi−1))(Wi)T
梯度爆炸
- 使用 ReLU 作为激活函数
σ ( x ) = max ( 0 , x ) and σ ′ ( x ) = { 1 if x > 0 0 otherwise \sigma(x) = \max(0, x) \quad \text{and} \quad \sigma'(x) = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{otherwise} \end{cases} σ(x)=max(0,x)andσ′(x)={10if x>0otherwise ∏ i = t d − 1 ∂ h i + 1 ∂ h i = ∏ i = t d − 1 diag ( σ ′ ( W i h i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1} \frac{\partial \mathbf{h}^{i+1}}{\partial \mathbf{h}^i} = \prod_{i=t}^{d-1} \text{diag}(\sigma'(\mathbf{W}^i \mathbf{h}^{i-1})) (\mathbf{W}^i)^T i=t∏d−1∂hi∂hi+1=i=t∏d−1diag(σ′(Wihi−1))(Wi)T - 如果 d − t d-t d−t 很大(网络比较深的话),值将会很大
梯度爆炸的问题
- 值超出值域 (infinity)
- 对于 16位浮点数尤为严重(数值区间 6e-5 - 6e4)
- 对学习率敏感
- 如果学习率太大 -> 大参数值 -> 更大的梯度
- 如果学习率太小 -> 训练无进展
- 我们可能需要在训练过程不断调整学习率
梯度消失
- 使用 sigmoid 作为激活函数
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x)) - ∏ i = t d − 1 ∂ h i + 1 ∂ h i = ∏ i = t d − 1 diag ( σ ′ ( W i h i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1} \frac{\partial \mathbf{h}^{i+1}}{\partial \mathbf{h}^i} = \prod_{i=t}^{d-1} \text{diag}(\sigma'(\mathbf{W}^i \mathbf{h}^{i-1})) (\mathbf{W}^i)^T ∏i=td−1∂hi∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)T 的元素值是 d − t d-t d−t 个小数值的乘积
0. 8 100 ≈ 2 × 1 0 − 10 0.8^{100} \approx 2 \times 10^{-10} 0.8100≈2×10−10
梯度消失的问题
- 梯度值变成 0
- 对 16 位浮点数尤为严重
- 训练没有进展
- 不管如何选择学习率
- 对于底部层尤为严重
- 仅仅顶部层训练的较好
- 无法让神经网络更深,和浅神经网络没有啥区别
总结
- 当数值过大或者过小时会导致数值问题
- 常发生在深度模型中,因为其会对 n 个数累积乘
- (上述还是没咋听懂,再听一遍,手推一下)
模型初始化和激活函数
让训练更加稳定
- 目标: 让梯度值在合理的范围内
- 例如 [1e-6, 1e3]
- 将乘法变加法
- ResNet, LSTM
- 归一化
- 梯度归一化,梯度裁剪
- 合理的权重初始和激活函数
让每层的方差是一个常数
- 将每层的输出和梯度都看做随机变量
- 让它们的均值和方差都保持一致
正向
E [ h i t ] = 0 \mathbb{E}[h_i^t] = 0 E[hit]=0
Var [ h i t ] = a \text{Var}[h_i^t] = a Var[hit]=a
反向
E [ ∂ ℓ ∂ h i t ] = 0 \mathbb{E}\left[\frac{\partial \ell}{\partial h_i^t}\right] = 0 E[∂hit∂ℓ]=0
Var [ ∂ ℓ ∂ h i t ] = b ∀ i , t \text{Var}\left[\frac{\partial \ell}{\partial h_i^t}\right] = b \quad \forall i, t Var[∂hit∂ℓ]=b∀i,t
- a a a 和 b b b 都是常数
权重初始化
- 在合理值区间里随机初始参数
- 训练开始的时候更容易有数值不稳定
- 远离最优解的地方损失函数表面可能很复杂
- 最优解附近表面会比较平
- 使用 N ( 0 , 0.01 ) \mathcal{N}(0, 0.01) N(0,0.01) 来初始可能对小网络没问题,但不能保证深度神经网络
举一个 MLP 的例子:
-
假设
- w i , j t w_{i,j}^t wi,jt 是 i.i.d,那么 E [ w i , j t ] = 0 \mathbb{E}[w_{i,j}^t] = 0 E[wi,jt]=0, Var [ w i , j t ] = γ t \text{Var}[w_{i,j}^t] = \gamma_t Var[wi,jt]=γt
- h i t − 1 h_i^{t-1} hit−1 独立于 w i , j t w_{i,j}^t wi,jt
-
假设没有激活函数 h t = W t h t − 1 \mathbf{h}^t = \mathbf{W}^t \mathbf{h}^{t-1} ht=Wtht−1,这里 W t ∈ R n t × n t − 1 \mathbf{W}^t \in \mathbb{R}^{n_t \times n_{t-1}} Wt∈Rnt×nt−1
E [ h i t ] = E [ ∑ j w i , j t h j t − 1 ] = ∑ j E [ w i , j t ] E [ h j t − 1 ] = 0 \mathbb{E}[h_i^t] = \mathbb{E}\left[ \sum_j w_{i,j}^t h_j^{t-1} \right] = \sum_j \mathbb{E}[w_{i,j}^t] \mathbb{E}[h_j^{t-1}] = 0 E[hit]=E[j∑wi,jthjt−1]=j∑E[wi,jt]E[hjt−1]=0
- 正向方差
Var [ h i t ] = E [ ( h i t ) 2 ] − E [ h i t ] 2 = E [ ( ∑ j w i , j t h j t − 1 ) 2 ] \text{Var}[h_i^t] = \mathbb{E}[(h_i^t)^2] - \mathbb{E}[h_i^t]^2 = \mathbb{E}\left[\left(\sum_j w_{i,j}^t h_j^{t-1}\right)^2\right] Var[hit]=E[(hit)2]−E[hit]2=E (j∑wi,jthjt−1)2 = E [ ∑ j ( w i , j t ) 2 ( h j t − 1 ) 2 + ∑ j ≠ k w i , j t w i , k t h j t − 1 h k t − 1 ] = \mathbb{E}\left[\sum_j \left(w_{i,j}^t\right)^2 \left(h_j^{t-1}\right)^2 + \sum_{j \neq k} w_{i,j}^t w_{i,k}^t h_j^{t-1} h_k^{t-1}\right] =E j∑(wi,jt)2(hjt−1)2+j=k∑wi,jtwi,kthjt−1hkt−1 = ∑ j E [ ( w i , j t ) 2 ] E [ ( h j t − 1 ) 2 ] = \sum_j \mathbb{E}\left[\left(w_{i,j}^t\right)^2\right] \mathbb{E}\left[\left(h_j^{t-1}\right)^2\right] =j∑E[(wi,jt)2]E[(hjt−1)2] = ∑ j Var [ w i , j t ] Var [ h j t − 1 ] = n t − 1 γ t Var [ h j t − 1 ] = \sum_j \text{Var}[w_{i,j}^t] \text{Var}[h_j^{t-1}] = n_{t-1} \gamma_t \text{Var}[h_j^{t-1}] =j∑Var[wi,jt]Var[hjt−1]=nt−1γtVar[hjt−1] n t − 1 γ t = 1 n_{t-1} \gamma_t = 1 nt−1γt=1
反向均值和方差
- 跟正向情况类似
∂ ℓ ∂ h t − 1 = ∂ ℓ ∂ h t W t \frac{\partial \ell}{\partial \mathbf{h}^{t-1}} = \frac{\partial \ell}{\partial \mathbf{h}^t} \mathbf{W}^t ∂ht−1∂ℓ=∂ht∂ℓWt ⇒ \Rightarrow ⇒ ( ∂ ℓ ∂ h t − 1 ) T = ( W t ) T ( ∂ ℓ ∂ h t ) T \left( \frac{\partial \ell}{\partial \mathbf{h}^{t-1}} \right)^T = (\mathbf{W}^t)^T \left( \frac{\partial \ell}{\partial \mathbf{h}^t} \right)^T (∂ht−1∂ℓ)T=(Wt)T(∂ht∂ℓ)T E [ ∂ ℓ ∂ h i t − 1 ] = 0 \mathbb{E}\left[ \frac{\partial \ell}{\partial h_i^{t-1}} \right] = 0 E[∂hit−1∂ℓ]=0 Var [ ∂ ℓ ∂ h i t − 1 ] = n t γ t Var [ ∂ ℓ ∂ h j t ] \text{Var}\left[ \frac{\partial \ell}{\partial h_i^{t-1}} \right] = n_t \gamma_t \text{Var}\left[ \frac{\partial \ell}{\partial h_j^t} \right] Var[∂hit−1∂ℓ]=ntγtVar[∂hjt∂ℓ] ⇒ \Rightarrow ⇒ n t γ t = 1 n_t \gamma_t = 1 ntγt=1
Xavier 初始化
-
难以需要满足 n t − 1 γ t = 1 n_{t-1} \gamma_t = 1 nt−1γt=1 和 n t γ t = 1 n_t \gamma_t = 1 ntγt=1
-
Xavier 使得 γ t ( n t − 1 + n t ) / 2 = 1 \gamma_t (n_{t-1} + n_t) / 2 = 1 γt(nt−1+nt)/2=1 → γ t = 2 / ( n t − 1 + n t ) \gamma_t = 2 / (n_{t-1} + n_t) γt=2/(nt−1+nt)
-
正态分布 N ( 0 , 2 n t − 1 + n t ) \mathcal{N}\left(0, \sqrt{\frac{2}{n_{t-1} + n_t}}\right) N(0,nt−1+nt2)
-
均匀分布 U ( − 6 n t − 1 + n t , 6 n t − 1 + n t ) \mathcal{U}\left(-\sqrt{\frac{6}{n_{t-1} + n_t}}, \sqrt{\frac{6}{n_{t-1} + n_t}}\right) U(−nt−1+nt6,nt−1+nt6)
- 分布 U [ − a , a ] \mathcal{U}[-a, a] U[−a,a] 和方差是 a 2 / 3 a^2 / 3 a2/3
-
-
适配权重形状变换,特别是 n t n_t nt
假设线性的激活函数
- 假设 σ ( x ) = α x + β \sigma(x) = \alpha x + \beta σ(x)=αx+β h ′ = W t h t − 1 and h t = σ ( h ′ ) \mathbf{h}' = \mathbf{W}^t \mathbf{h}^{t-1} \quad \text{and} \quad \mathbf{h}^t = \sigma(\mathbf{h}') h′=Wtht−1andht=σ(h′) E [ h i ′ ] = E [ α h i ′ + β ] = β ⇒ β = 0 \mathbb{E}[h_i'] = \mathbb{E}[\alpha h_i' + \beta] = \beta \quad \Rightarrow \quad \beta = 0 E[hi′]=E[αhi′+β]=β⇒β=0 Var [ h i ′ ] = E [ ( h i ′ ) 2 ] − E [ h i ′ ] 2 \text{Var}[h_i'] = \mathbb{E}[(h_i')^2] - \mathbb{E}[h_i']^2 Var[hi′]=E[(hi′)2]−E[hi′]2 = E [ ( α h i ′ + β ) 2 ] − β 2 = \mathbb{E}[(\alpha h_i' + \beta)^2] - \beta^2 =E[(αhi′+β)2]−β2 = E [ α 2 ( h i ′ ) 2 + 2 α β h i ′ + β 2 ] − β 2 = \mathbb{E}[\alpha^2 (h_i')^2 + 2\alpha\beta h_i' + \beta^2] - \beta^2 =E[α2(hi′)2+2αβhi′+β2]−β2 = α 2 Var [ h i ′ ] = \alpha^2 \text{Var}[h_i'] =α2Var[hi′] ⇒ α = 1 \Rightarrow \quad \alpha = 1 ⇒α=1
反向
- 假设 σ ( x ) = α x + β \sigma(x) = \alpha x + \beta σ(x)=αx+β
∂ ℓ ∂ h ′ = ∂ ℓ ∂ h t ( W t ) T and ∂ ℓ ∂ h t − 1 = α ∂ ℓ ∂ h ′ \frac{\partial \ell}{\partial \mathbf{h}'} = \frac{\partial \ell}{\partial \mathbf{h}^t} (\mathbf{W}^t)^T \quad \text{and} \quad \frac{\partial \ell}{\partial \mathbf{h}^{t-1}} = \alpha \frac{\partial \ell}{\partial \mathbf{h}'} ∂h′∂ℓ=∂ht∂ℓ(Wt)Tand∂ht−1∂ℓ=α∂h′∂ℓ E [ ∂ ℓ ∂ h i t − 1 ] = 0 ⇒ β = 0 \mathbb{E}\left[ \frac{\partial \ell}{\partial h_i^{t-1}} \right] = 0 \quad \Rightarrow \quad \beta = 0 E[∂hit−1∂ℓ]=0⇒β=0 Var [ ∂ ℓ ∂ h i t − 1 ] = α 2 Var [ ∂ ℓ ∂ h j ′ ] ⇒ α = 1 \text{Var}\left[ \frac{\partial \ell}{\partial h_i^{t-1}} \right] = \alpha^2 \text{Var}\left[ \frac{\partial \ell}{\partial h_j'} \right] \quad \Rightarrow \quad \alpha = 1 Var[∂hit−1∂ℓ]=α2Var[∂hj′∂ℓ]⇒α=1
总结
- 合理的权重初始值和激活函数的选取可以提升数值稳定性
QA 思考
Q1: nan,inf 的产生以及如何解决
A1:inf 就是太大了,lr 调的过大或者权重初始时太大了。nan 一般就是除以 0 了。合理的初始化权重,将学习率调节的比较小。
相关文章:
数值稳定性 + 模型初始化和激活函数
数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft(ht−1)andyℓ∘fd∘…∘…...
【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
1. 消息队列 几个组件: Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用…...
TCP协议与wireshark抓包分析
一、tcp协议格式 1. 源端口号 : 发送方使用的端口号 2. 目的端口号 : 接收方使用的端口号 3. 序号: 数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包,…...
深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述
目录 📂 深度学习四大核心架构 🌰 知识点概述 🧠 核心区别对比表 ⚡ 生活化案例理解 🔑 选型指南 📂 深度学习四大核心架构 第一篇: 神经网络基础(NN) 🌰 知识点概述…...
springcloud 整合 Redis_Redisson
springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...
Windows模仿Mac大小写切换, 中英文切换
CapsLock 功能优化脚本部署指南 部署步骤 第一步:安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步:部署脚本 直接运行 (调试推荐) 新建文本文件,粘贴…...
基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【银河麒麟系统常识】命令:uname -m(查看系统架构)
命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...
网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...
【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...
Dify 0.15.3版本 本地部署指南
目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Burp Suite从入门到实战之配置启动
目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK,JDK包含JRE(Java运行时环境) 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...
【力扣hot100题】(016)缺失的第一个正数
题目里这么多条条框框……先不按条条框框做了两下。 第一个思路:你不仁我不义,先排序后遍历(时间不符题意) class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...
(undone) MIT6.824 Lecture 02 - RPC and Threads
知乎专栏:https://zhuanlan.zhihu.com/p/641105196 原视频:https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go?…...
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules) 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块化的意义:分而治之 模块化解决代码依赖混…...
输入百分比校验(数字非负数保留2位不四舍五入)
场景用于输入百分比,限制只能输入非负数,保留2位小数,且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...
Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)
一、KNN算法简介 1.1、定义 KNN(K-Nearest Neighbor)算法是一种基于实例的学习方法,通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术,依赖于距离最近的邻居来推断数据点的类别或数值,为许…...
SpringBoot 3+ Lombok日志框架从logback改为Log4j2
r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2,并配置按日期滚动文件和控制台输出,请按照以下步骤操作: 步骤 1:排除Logback并添加Log4j2依赖 在pom.xml中修改依赖: <dependencies><!-- 排除默…...
实战篇Redis
黑马程序员的Redis的笔记(后面补一下图片) 【黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…...
c++-函数增强
一、编译器对函数名的处理 1. C与C的差异 C编译器:保留原始函数名,无额外处理。例如: int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器:通过name mangling(名称修饰)生成唯一函数…...
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab) 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...
css基础之浮动相关学习
一、浮动基本介绍 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...
告别分库分表,时序数据库 TDengine 解锁燃气监控新可能
达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…...
1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯
动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...
8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是: 每趟选择:从待排序序列中选择最小(或最大&#x…...
【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis
基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码,通过ArithmeticCaptcha生成一张验证码图片,通过text()函数得到验证码的答案保存到变量code,然后把图…...
LiteDB 数据存储与检索效率优化的最佳实践指导
一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...
WEB安全--RCE--RCE的绕过
一、回调函数的绕过(PHP) 1.1、回调函数 1.1.1、原理: 回调函数(Callback Function)指的是将函数名或匿名函数作为参数传递给另一个函数,从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...
uni-app:指引蒙层
组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...
什么是CMS?常用CMS有哪些?
一、内容管理系统(Content Management System) 什么是CMS:位于 Web 前端(服务器)和后端办公系统之间的软件系统,用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...
【Es】基础入门:开启全文搜索的大门
文章目录 一、Elasticsearch 是什么二、核心概念解读索引(Index)文档(Document)映射(Mapping)分片(Shard)副本(Replica) 三、基本操作入门安…...
74. Linux设备树详解
一、什么是设备树 1、uboot启动内核用到zImage,imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000. 80800000 —zImage 83000000—dtb 2、设备树:设备和树。 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设…...
从责任链模式聊到aware接口
从责任链模式聊到aware接口 责任链是什么? 责任链模式是一种行为型设计模式,将多个对象连接成一条链,并且沿着这条链传递请求,让多个对象都有机会处理这个请求,请求会顺着链传递,直到某个对象处理它为止。…...
在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装
在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长,这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…...
考研408-数据结构完整代码 线性表的链式存储结构 - 单链表
单链表操作详解(C实现) 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...
使用Python爬虫获取淘宝App商品详情
在电商领域,获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台,提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂,但通过Python爬虫技术,我们可以高效地获取淘宝App商品的详细信息…...
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式时,通常是由于 网络配置错误、桥接适配器选择不当或主机网络环境限制 导致。以下是详细的排查和解决方法:我采用第一步就解决了问题 1. 检查 VMware 桥接模式配置 步骤 1:…...
2025前端八股文终极指南:从高频考点到降维打击的面试突围战
2025前端八股文终极指南:从高频考点到降维打击的面试突围战 一、2025前端八股文核心考点重构 1.1 新型响应式系统三连问 Vue3信号式响应性: // 信号式响应性底层实现 const [count, setCount] createSignal(0) effect(() > {console.log("当…...
MIPS-32架构(寄存器堆,指令系统,运算器)
文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本,本文介绍32位版本 寄存器 正如笔者曾说…...
MySQL数据库和表的操作之SQL语句
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 MySQL数据库和表的操作 关系型数据库,都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL:结构化查询语言(Structured Query Language)&…...
Ubuntu在VMware中无法全屏
Ubuntu在VMware中无法全屏 方法:安装open-vm-tools 在Ubuntu打开终端: 1.输入: sudo apt-get install open-vm-tools2.安装依赖: sudo apt-get install open-vm*3.重启Ubuntu reboot...
[C++面试] 智能指针面试点(重点)续3
[C面试] RAII资源获取即初始化(重点)-CSDN博客 [C面试] 智能指针面试点(重点)-CSDN博客 [C面试] 智能指针面试点(重点)续1-CSDN博客 [C面试] 智能指针面试点(重点)续2-CSDN博客 …...
借助FastAdmin和uniapp,高效搭建AI智能平台
在数字化办公时代,效率与协作是企业发展的核心竞争力。传统的办公工具虽然功能丰富,但在面对复杂多变的团队协作需求时,往往显得力不从心。为了解决这一痛点,我们推出了一款全新的办公AI平台,它不仅能够满足文字和语音…...
【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术
《异构计算云服务和 AI 加速器》系列,共包含以下文章: 异构计算云服务和 AI 加速器(一):功能特点异构计算云服务和 AI 加速器(二):适用场景异构计算云服务和 AI 加速器(…...
Unity功能模块一对话系统(5)-完善对话流程及功能
现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。 最终效果功能展示 功能一:场景内可根据资源序号ID来…...
Ubuntu 系统中安装 Nginx
步骤 1:更新软件包列表 在安装前,先更新系统软件包列表: sudo apt update步骤 2:安装 Nginx 通过 apt 直接安装 Nginx: sudo apt install nginx -y步骤 3:验证安装 安装完成后,检查 Nginx …...
Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
作者:来自 Elastic James Williams 了解如何使用 Azure AI 文档智能解析包含文本和表格数据的 PDF 文档。 Azure AI 文档智能是一个强大的工具,用于从 PDF 中提取结构化数据。它可以有效地提取文本和表格数据。提取的数据可以索引到 Elastic Cloud Serve…...