RNN - 循环神经网络(概念介绍)
RNN
潜变量自回归模型
- 使用潜变量 h t h_t ht 总结过去信息
p ( h t ∣ h t − 1 , x t − 1 ) p(h_t | h_{t-1}, x_{t-1}) p(ht∣ht−1,xt−1)
p ( x t ∣ h t , x t − 1 ) p(x_t | h_t, x_{t-1}) p(xt∣ht,xt−1)
循环神经网络
- 更新隐藏状态: h t = ϕ ( W h h h t − 1 + W h x x t − 1 + b h ) \mathbf{h}_t = \phi(\mathbf{W}_{hh} \mathbf{h}_{t-1} + \mathbf{W}_{hx} \mathbf{x}_{t-1} + \mathbf{b}_h) ht=ϕ(Whhht−1+Whxxt−1+bh)
- 输出: o t = ϕ ( W h o h t + b o ) \mathbf{o}_t = \phi(\mathbf{W}_{ho} \mathbf{h}_t + \mathbf{b}_o) ot=ϕ(Whoht+bo)
去掉 W h h h t − 1 \mathbf{W}_{hh} \mathbf{h}_{t-1} Whhht−1 这一项就退化成MLP
困惑度(perplexity)
-
衡量一个语言模型的好坏可以用平均交叉熵:
π = 1 n ∑ i = 1 n − log p ( x i ∣ x i − 1 , . . . ) \pi = \frac{1}{n} \sum_{i=1}^{n} -\log p(x_i | x_{i-1}, ...) π=n1i=1∑n−logp(xi∣xi−1,...)
p p p 是语言模型的预测概率, x i x_i xi 是真实词 -
历史原因NLP使用困惑度 exp ( π ) \exp(\pi) exp(π) 来衡量,是平均每次可能选项
- 1表示完美,无穷大是最差情况
梯度裁剪
- 迭代中计算这 T T T 个时间步上的梯度,在反向传播过程中产生长度为 O ( T ) O(T) O(T) 的矩阵乘法链,导致数值不稳定。
- 梯度裁剪能有效预防梯度爆炸:
- 如果梯度长度超过 θ \theta θ,那么投影回长度 θ \theta θ
g ← min ( 1 , θ ∥ g ∥ ) g \mathbf{g} \leftarrow \min \left(1, \frac{\theta}{\|\mathbf{g}\|}\right) \mathbf{g} g←min(1,∥g∥θ)g
- 如果梯度长度超过 θ \theta θ,那么投影回长度 θ \theta θ
更多的应用 RNNs
总结
- 循环神经网络的输出取决于当下输入和前一时间的隐变量
- 应用到语言模型中时,循环神经网络根据当前词预测下一次时刻词
- 通常使用困惑度来衡量语言模型的好坏
详细说明
循环神经网络
元语法模型中,单词 x t x_t xt在时间步 t t t的条件概率仅取决于前面 n − 1 n-1 n−1个单词。对于时间步 t − ( n − 1 ) t-(n-1) t−(n−1)之前的单词,如果我们想将其可能产生的影响合并到 x t x_t xt上,需要增加 n n n,然而模型参数的数量也会随之呈指数增长,因为词表 V \mathcal{V} V需要存储 ∣ V ∣ n |\mathcal{V}|^n ∣V∣n个数字,因此与其将 P ( x t ∣ x t − 1 , … , x t − n + 1 ) P(x_t \mid x_{t-1}, \ldots, x_{t-n+1}) P(xt∣xt−1,…,xt−n+1)模型化,不如使用隐变量模型:
P ( x t ∣ x t − 1 , … , x 1 ) ≈ P ( x t ∣ h t − 1 ) , P(x_t \mid x_{t-1}, \ldots, x_1) \approx P(x_t \mid h_{t-1}), P(xt∣xt−1,…,x1)≈P(xt∣ht−1),其中 h t − 1 h_{t-1} ht−1是隐状态(hidden state),也称为隐藏变量(hidden variable),它存储了到时间步 t − 1 t-1 t−1的序列信息。通常,我们可以基于当前输入 x t x_{t} xt和先前隐状态 h t − 1 h_{t-1} ht−1来计算时间步 t t t处的任何时间的隐状态: h t = f ( x t , h t − 1 ) . h_t = f(x_{t}, h_{t-1}). ht=f(xt,ht−1).对于上式中的函数 f f f,隐变量模型不是近似值。毕竟 h t h_t ht是可以仅仅存储到目前为止观察到的所有数据,然而这样的操作可能会使计算和存储的代价都变得昂贵。
值得注意的是,隐藏层和隐状态指的是两个截然不同的概念。如上所述,隐藏层是在从输入到输出的路径上(以观测角度来理解)的隐藏的层,而隐状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入,并且这些状态只能通过先前时间步的数据来计算。
循环神经网络(recurrent neural networks,RNNs)是具有隐状态的神经网络。
在介绍循环神经网络模型之前,首先介绍多层感知机模型。
无隐状态的神经网络
只有单隐藏层的多层感知机,设隐藏层的激活函数为 ϕ \phi ϕ,给定一个小批量样本 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} X∈Rn×d,其中批量大小为 n n n,输入维度为 d d d,则隐藏层的输出 H ∈ R n × h \mathbf{H} \in \mathbb{R}^{n \times h} H∈Rn×h通过下式计算:
H = ϕ ( X W x h + b h ) . \mathbf{H} = \phi(\mathbf{X} \mathbf{W}_{xh} + \mathbf{b}_h). H=ϕ(XWxh+bh).
隐藏层权重参数为 W x h ∈ R d × h \mathbf{W}_{xh} \in \mathbb{R}^{d \times h} Wxh∈Rd×h,偏置参数为 b h ∈ R 1 × h \mathbf{b}_h \in \mathbb{R}^{1 \times h} bh∈R1×h,以及隐藏单元的数目为 h h h。因此求和时可以应用广播机制接下来,将隐藏变量 H \mathbf{H} H用作输出层的输入。输出层由下式给出:
O = H W h q + b q , \mathbf{O} = \mathbf{H} \mathbf{W}_{hq} + \mathbf{b}_q, O=HWhq+bq,其中, O ∈ R n × q \mathbf{O} \in \mathbb{R}^{n \times q} O∈Rn×q是输出变量, W h q ∈ R h × q \mathbf{W}_{hq} \in \mathbb{R}^{h \times q} Whq∈Rh×q是权重参数, b q ∈ R 1 × q \mathbf{b}_q \in \mathbb{R}^{1 \times q} bq∈R1×q是输出层的偏置参数。如果是分类问题,我们可以用 softmax ( O ) \text{softmax}(\mathbf{O}) softmax(O)来计算输出类别的概率分布。因此只要可以随机选择“特征-标签”对,并且通过自动微分和随机梯度下降能够学习网络参数就可以了。
有隐状态的循环神经网络
有了隐状态后,情况就完全不同了。假设在时间步 t t t有小批量输入 X t ∈ R n × d \mathbf{X}_t \in \mathbb{R}^{n \times d} Xt∈Rn×d。换言之,对于 n n n个序列样本的小批量, X t \mathbf{X}_t Xt的每一行对应于来自该序列的时间步 t t t处的一个样本。接下来,用 H t ∈ R n × h \mathbf{H}_t \in \mathbb{R}^{n \times h} Ht∈Rn×h表示时间步 t t t的隐藏变量。与多层感知机不同的是,我们在这里保存了前一个时间步的隐藏变量 H t − 1 \mathbf{H}_{t-1} Ht−1,并引入了一个新的权重参数 W h h ∈ R h × h \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} Whh∈Rh×h,来描述如何在当前时间步中使用前一个时间步的隐藏变量。
具体地说,当前时间步隐藏变量由当前时间步的输入与前一个时间步的隐藏变量一起计算得出:
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht−1Whh+bh).与无隐状态的相比,多添加了一项 H t − 1 W h h \mathbf{H}_{t-1} \mathbf{W}_{hh} Ht−1Whh,从相邻时间步的隐藏变量 H t \mathbf{H}_t Ht和 H t − 1 \mathbf{H}_{t-1} Ht−1之间的关系可知,这些变量捕获并保留了序列直到其当前时间步的历史信息,就如当前时间步下神经网络的状态或记忆,因此这样的隐藏变量被称为隐状态(hidden state)。由于在当前时间步中,
隐状态使用的定义与前一个时间步中使用的定义相同,因此上述计算是循环的(recurrent)。于是基于循环计算的隐状态神经网络被命名为循环神经网络(recurrent neural network)。在循环神经网络中执行上述计算的层称为循环层(recurrent layer)。
有许多不同的方法可以构建循环神经网络,下面定义的隐状态的循环神经网络是非常常见的一种。对于时间步 t t t,输出层的输出类似于多层感知机中的计算:
O t = H t W h q + b q . \mathbf{O}_t = \mathbf{H}_t \mathbf{W}_{hq} + \mathbf{b}_q. Ot=HtWhq+bq.循环神经网络的参数包括隐藏层的权重 W x h ∈ R d × h , W h h ∈ R h × h \mathbf{W}_{xh} \in \mathbb{R}^{d \times h}, \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} Wxh∈Rd×h,Whh∈Rh×h和偏置 b h ∈ R 1 × h \mathbf{b}_h \in \mathbb{R}^{1 \times h} bh∈R1×h,
以及输出层的权重 W h q ∈ R h × q \mathbf{W}_{hq} \in \mathbb{R}^{h \times q} Whq∈Rh×q和偏置 b q ∈ R 1 × q \mathbf{b}_q \in \mathbb{R}^{1 \times q} bq∈R1×q。值得一提的是,即使在不同的时间步,循环神经网络也总是使用这些模型参数。因此,循环神经网络的参数开销不会随着时间步的增加而增加。
下图展示了循环神经网络在三个相邻时间步的计算逻辑。在任意时间步 t t t,隐状态的计算可以被视为:
- 拼接当前时间步 t t t的输入 X t \mathbf{X}_t Xt和前一时间步 t − 1 t-1 t−1的隐状态 H t − 1 \mathbf{H}_{t-1} Ht−1;
- 将拼接的结果送入带有激活函数 ϕ \phi ϕ的全连接层。 全连接层的输出是当前时间步 t t t的隐状态 H t \mathbf{H}_t Ht。
在本例中,模型参数是 W x h \mathbf{W}_{xh} Wxh和 W h h \mathbf{W}_{hh} Whh的拼接,以及 b h \mathbf{b}_h bh的偏置。当前时间步 t t t的隐状态 H t \mathbf{H}_t Ht将参与计算下一时间步 t + 1 t+1 t+1的隐状态 H t + 1 \mathbf{H}_{t+1} Ht+1。而且 H t \mathbf{H}_t Ht还将送入全连接输出层,用于计算当前时间步 t t t的输出 O t \mathbf{O}_t Ot。
刚才提到,隐状态中 X t W x h + H t − 1 W h h \mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} XtWxh+Ht−1Whh的计算,相当于 X t \mathbf{X}_t Xt和 H t − 1 \mathbf{H}_{t-1} Ht−1的拼接与 W x h \mathbf{W}_{xh} Wxh和 W h h \mathbf{W}_{hh} Whh的拼接的矩阵乘法。虽然这个性质可以通过数学证明,
但在下面我们使用一个简单的代码来说明一下。
首先,我们定义矩阵X
、W_xh
、H
和W_hh
,它们的形状分别为 ( 3 , 1 ) (3,1) (3,1)、 ( 1 , 4 ) (1,4) (1,4)、 ( 3 , 4 ) (3,4) (3,4)和 ( 4 , 4 ) (4,4) (4,4)。分别将X
乘以W_xh
,将H
乘以W_hh
,然后将这两个乘法相加,我们得到一个形状为 ( 3 , 4 ) (3,4) (3,4)的矩阵。
import torch
from d2l import torch as d2lX, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
沿列(轴1)拼接矩阵X
和H
,沿行(轴0)拼接矩阵W_xh
和W_hh
。这两个拼接分别产生形状 ( 3 , 5 ) (3, 5) (3,5)和形状 ( 5 , 4 ) (5, 4) (5,4)的矩阵。再将这两个拼接的矩阵相乘,我们得到与上面相同形状 ( 3 , 4 ) (3, 4) (3,4)的输出矩阵。
torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))
基于循环神经网络的字符级语言模型
要想根据过去的和当前的词元预测下一个词元,需要将原始序列移位一个词元作为标签。Bengio等人首先提出使用神经网络进行语言建模 :cite:Bengio.Ducharme.Vincent.ea.2003
。
接下来,我们看一下如何使用循环神经网络来构建语言模型。设小批量大小为1,批量中的文本序列为“machine”。为了简化后续部分的训练,我们考虑使用字符级语言模型(character-level language model),将文本词元化为字符而不是单词。下图演示了如何通过基于字符级语言建模的循环神经网络,使用当前的和先前的字符预测下一个字符。
在训练过程中,我们对每个时间步的输出层的输出进行softmax操作,然后利用交叉熵损失计算模型输出和标签之间的误差。由于隐藏层中隐状态的循环计算,上图中的第 3 3 3个时间步的输出 O 3 \mathbf{O}_3 O3由文本序列“m”“a”和“c”确定。由于训练数据中这个文本序列的下一个字符是“h”,因此第 3 3 3个时间步的损失将取决于下一个字符的概率分布,而下一个字符是基于特征序列“m”“a”“c”和这个时间步的标签“h”生成的。
在实践中,我们使用的批量大小为 n > 1 n>1 n>1,每个词元都由一个 d d d维向量表示。因此,在时间步 t t t输入 X t \mathbf X_t Xt将是一个 n × d n\times d n×d矩阵。
困惑度(Perplexity)
最后讨论如何度量语言模型的质量,这将在后续部分中用于评估基于循环神经网络的模型。一个好的语言模型能够用高度准确的词元来预测我们接下来会看到什么。考虑一下由不同的语言模型给出的对“It is raining …”(“…下雨了”)的续写:
- “It is raining outside”(外面下雨了);
- “It is raining banana tree”(香蕉树下雨了);
- “It is raining piouw;kcj pwepoiut”(piouw;kcj pwepoiut下雨了)。
就质量而言,例 1 1 1显然是最合乎情理、在逻辑上最连贯的。虽然这个模型可能没有很准确地反映出后续词的语义,比如,“It is raining in San Francisco”(旧金山下雨了)和“It is raining in winter”(冬天下雨了)可能才是更完美的合理扩展,但该模型已经能够捕捉到跟在后面的是哪类单词。例 2 2 2则要糟糕得多,因为其产生了一个无意义的续写。尽管如此,至少该模型已经学会了如何拼写单词,以及单词之间的某种程度的相关性。最后,例 3 3 3表明了训练不足的模型是无法正确地拟合数据的。
我们可以通过计算序列的似然概率来度量模型的质量。然而这是一个难以理解、难以比较的数字。毕竟,较短的序列比较长的序列更有可能出现,因此评估模型产生托尔斯泰的巨著《战争与和平》的可能性不可避免地会比产生圣埃克苏佩里的中篇小说《小王子》可能性要小得多。
而缺少的可能性值相当于平均数。
在这里,信息论可以派上用场了。我们在引入softmax回归( numref:subsec_info_theory_basics
)时定义了熵、惊异和交叉熵,并在信息论的在线附录
中讨论了更多的信息论知识。如果想要压缩文本,我们可以根据当前词元集预测的下一个词元。一个更好的语言模型应该能让我们更准确地预测下一个词元。因此,它应该允许我们在压缩序列时花费更少的比特。所以我们可以通过一个序列中所有的 n n n个词元的交叉熵损失的平均值来衡量:
1 n ∑ t = 1 n − log P ( x t ∣ x t − 1 , … , x 1 ) , \frac{1}{n} \sum_{t=1}^n -\log P(x_t \mid x_{t-1}, \ldots, x_1), n1t=1∑n−logP(xt∣xt−1,…,x1),其中 P P P由语言模型给出, x t x_t xt是在时间步 t t t从该序列中观察到的实际词元。这使得不同长度的文档的性能具有了可比性。由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity)的量。简而言之,它是上面式子的指数:
exp ( − 1 n ∑ t = 1 n log P ( x t ∣ x t − 1 , … , x 1 ) ) . \exp\left(-\frac{1}{n} \sum_{t=1}^n \log P(x_t \mid x_{t-1}, \ldots, x_1)\right). exp(−n1t=1∑nlogP(xt∣xt−1,…,x1)).困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”。
看一些案例。
- 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。
- 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。
- 在基线上,该模型的预测是词表的所有可用词元上的均匀分布。 在这种情况下,困惑度等于词表中唯一词元的数量。
事实上,如果我们在没有任何压缩的情况下存储序列,这将是我们能做的最好的编码方式。因此,这种方式提供了一个重要的上限, 而任何实际模型都必须超越这个上限。
小结
- 对隐状态使用循环计算的神经网络称为循环神经网络(RNN)。
- 循环神经网络的隐状态可以捕获直到当前时间步序列的历史信息。
- 循环神经网络模型的参数数量不会随着时间步的增加而增加。
- 我们可以使用循环神经网络创建字符级语言模型。
- 我们可以使用困惑度来评价语言模型的质量。
QA 思考
Q1:循环神经网络与递归神经网络是一个东西吗?如果不是,有什么区别呢?
A1:区别如下:
-
循环神经网络 (RNN):
- RNN 是专门设计来处理序列数据的神经网络。它通过在网络中形成一个循环来实现对序列的记忆,即网络中的某一层会接收上一时间步的信息作为当前时间步的输入之一。
- 这种结构使得 RNN 非常适合处理与时间相关的任务,如时间序列预测、自然语言处理中的文本生成等。
- RNN 的一个主要问题是长期依赖问题,为了解决这个问题,衍生出了 LSTM(长短期记忆网络)和 GRU(门控循环单元)等改进模型。
-
递归神经网络 (Recursive Neural Network):
- 递归神经网络是一种用于处理层次结构数据的模型,比如树形结构的数据。它通过递归地将父节点与其子节点组合起来构建一个深度模型。
- 递归神经网络通常用于自然语言处理中的句法解析或者图像中的部分-整体关系识别等需要考虑数据内在结构的任务。
- 和 RNN 不同,递归神经网络的结构不是基于时间的循环,而是基于数据本身的层级结构进行递归操作。
相关文章:
RNN - 循环神经网络(概念介绍)
RNN 潜变量自回归模型 使用潜变量 h t h_t ht 总结过去信息 p ( h t ∣ h t − 1 , x t − 1 ) p(h_t | h_{t-1}, x_{t-1}) p(ht∣ht−1,xt−1) p ( x t ∣ h t , x t − 1 ) p(x_t | h_t, x_{t-1}) p(xt∣ht,xt−1) 循环神经网络 更新隐藏状态࿱…...
OpenCV的详细介绍与安装(一)
1.OpenCV概述 OpenCV是一个开源的计算机视觉和机器学习软件库, 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,它支持多种编程语言(如C、Python、Java),并可在Windows、Linux、macOS、Android和iOS等平台上运行…...
50、Spring Boot 详细讲义(七) Spring Boot 与 NoSQL
七 Spring Boot 与 NoSQL 目录 MongoDB 集成Redis 集成Elasticsearch 集成1、 MongoDB 集成 1.1 MongoDB 概述 1.1.1 MongoDB 的基本概念 文档型数据库: 数据存储为类似 JSON 的文档结构(BSON 格式)。每个文档由字段和值对组成,类似于键值对。支持嵌入式文档和数组,灵活…...
微信小程序组件传参
微信小程序组件传参感觉和vue还是挺像的 父组件向子组件传参 在小程序中父组件子组件传参,主要使用properties属性。演示下: 创建组件文件夹component,创建组件demoComponent,记得创建的时候选择组件,不是page页面 …...
C++实用函数:bind
本篇来介绍了C++中bind功能。 1 std::bind 在 C++ 里,std::bind 是一个函数模板,其作用是创建一个可调用对象,该对象可绑定到一组参数上。std::bind 的函数原型如下: template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&...…...
C# 程序结构||C# 基本语法
原文:C# 程序结构_w3cschool (注:本文为教程文章,请勿标记为付费文章!特此声明) 本节我们将学习 C# 编程语言的结构,为了让大家能够对 C# 程序结构有个更好的理解,我们会先演示一个…...
分库分表-除了hash分片还有别的吗?
在分库分表的设计中,除了常见的 Hash 分片,还有多种策略根据业务场景灵活选择。以下是几种主流的分库分表策略及其应用场景、技术实现和优缺点分析,结合项目经验(如标易行投标服务平台的高并发场景)进行说明: 一、常见分库分表策略 1. 范围分片(Range Sharding) 原理:…...
单片机非耦合业务逻辑框架
在小型单片机项目开发初期,由于业务逻辑相对简单,我们往往较少关注程序架构层面的设计。 然而随着项目经验的积累,开发者会逐渐意识到模块间的耦合问题:当功能迭代时,一处修改可能引发连锁反应。 此时,构…...
WordPress - 此站点出现严重错误
本篇讲 当WordPress出现 此站点出现严重错误 时,该如何解决。 目录 1,现象 2, FAQ 3,管理Menu无法打开 下面是详细内容。 1,现象 此站点出现严重错误(このサイトで重大なエラーが発生しました&#x…...
Java EE(8)——线程安全总结(翻新版)——定时器(Timer)线程池(ThreadPoolExecutor)
1.Timer 1.1Timer基本介绍 1.Timer的主要作用 任务调度:Timer允许你安排一个任务在未来的某个时间点执行,或者以固定的间隔重复执行 后台执行:Timer可以使用一个后台线程来执行任务,这意味着调度和执行任务不会阻塞主线程(主线程…...
#[特殊字符]Rhino建模教程 · 第一章:正方体建模入门
🦏Rhino建模教程 第一章:正方体建模入门 本章将从最基础的操作入手,带你一步步掌握Rhino建模的核心流程,适合新手或需要复习基础的用户。 🎯 目标:制作一个带凹槽、圆角、封盖的正方体模型,并…...
How to run ERSEM
Build ERSEM Make a “build” folder, and go into the build folder. Create “build_archer2.edit.sh” #!/usr/bin/env bash# Script for compiling FVCOM-FABM-ERSEM for ARCHER2 # # The build is split into three phases: # # 1) Build the FABM-ERSEM library. Her…...
关于QT5项目只生成一个CmakeLists.txt文件
编译器自动检测明明可以检测,Kit也没有报红 但是最后生成项目只有一个文件 一:检查cmake版本,我4.1版本cmake一直报错 cmake3.10可以用 解决之后还是有问题 把环境变量加上去:...
C++ string类
1.标准库中的string类 在 C 里,string类属于标准库的一部分,它在<string>头文件中定义,用于处理和操作字符串。 1.1string类的常用接口说明 1.1.1. string类对象的常见构造 string() (重点) 构造空的string类…...
如何使用ChatGPT撰写短视频爆款文案
短视频已经成为了互联网内容消费的重要形式,吸引观众的眼球成为内容创作者的首要任务。在短视频平台的内容过载中,如何写出一篇能够迅速吸引观众点击、分享并获得高互动的爆款文案,是每个短视频创作者都在追求的目标。今天,我们将…...
基于Tesseract与Opencv的电子发票识别[1]
本文我们将尝试使用tesseract识别电子发票上的信息并不断提高识别准确率,是一个逐渐调整的过程,仅用于记录研究过程。 图像识别:使用tesseract识别。图像预处理:使用OpenCV等图像处理库对发票图像进行预处理,如灰度化…...
数据库—函数笔记
一,数据库函数的分类 内置函数(Built-in Functions) 数据库系统自带的函数,无需额外定义即可直接调用。 聚合函数:对数据集进行计算(如 SUM, AVG, COUNT)。 字符串函数:处理文本数据…...
产品研发流程说明记录
1. 前言 在小型公司,产品研发流程通常较为简单,需求提出后经过简单评审便直接开发上线。而在中大型互联网公司,研发流程更加规范和系统,涉及多部门协作和多环节把控。本文将详细介绍一个标准的产品需求研发流程,帮助相…...
智慧城市:如同为城市装上智能大脑,开启智慧生活
智慧城市的概念随着信息技术的飞速发展而逐渐兴起,它通过集成物联网、大数据、人工智能和数字孪生等先进技术,为城市管理和居民生活带来了前所未有的智能化变革。本文将深入探讨这些核心技术及其在智慧城市的典型应用场景,展示智慧城市如何提…...
游戏测试入门知识
高内聚指的是一个模块或组件内部的功能应该紧密相关。这意味着模块内的所有元素都应该致力于实现同一个目标或功能,并且该模块应当尽可能独立完成这一任务。 低耦合则是指不同模块之间的依赖程度较低,即一个模块的变化对其它模块造成的影响尽可能小。理…...
Sentinel源码—2.Context和处理链的初始化二
大纲 1.Sentinel底层的核心概念 2.Sentinel中Context的设计思想与源码实现 3.Java SPI机制的引入 4.Java SPI机制在Sentinel处理链中的应用 5.Sentinel默认处理链ProcessorSlot的构建 4.Java SPI机制在Sentinel处理链中的应用 (1)初始化Entry会初始化处理链 (2)初始化处…...
Java基础第20天-JDBC
JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题,程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生…...
VMware下Ubuntu空间扩容
目的: Ubuntu空间剩余不足,需要对Ubuntu进行扩容。 使用工具: 使用Ubuntu系统中的gparted工具进行系统扩容。 前提: 1、电脑有多余的未分配磁盘空间,比如我的Ubuntu磁盘G盘是200G,现在快满了,…...
第十一章 网络编程
在TCP/IP协议中,“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程。 因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)…...
Bad Request 400
之前一直以为400就是前端代码有问题 这下遇到了,发现是因为前后端不一致 后端代码注意:现在我写的int 前端请求 原因 :前后端不一致 💡 问题核心:后端 amount 类型是 int,但前端传了小数 237.31...
行业深度:金融数据治理中的 SQL2API 应用创新
金融行业作为数据密集型领域,面临着监管合规要求严苛、数据交互频次高、安全风险防控难度大等多重挑战。SQL2API 技术通过 “数据服务化 合规化” 的双重赋能,成为金融机构破解数据治理难题的核心工具,在多个关键场景实现突破性创新。 &…...
记录学习的第二十六天
还是每日一题。 今天这道题有点难度,我看着题解抄的。 之后做了两道双指针问题。 这道题本来是想用纯暴力做的,结果出错了。😓...
MySQLQ_数据库约束
目录 什么是数据库约束约束类型NOT NULL 非空约束UNIQUE 唯一约束PRIMARY KEY主键约束FOREIGN KEY外键约束CHECK约束DEFAULT 默认值(缺省)约束 什么是数据库约束 数据库约束就是对数据库添加一些规则,使数据更准确,关联性更强 比如加了唯一值约束&#…...
数据库ocp证书是什么水平
专业知识与技能:OCP 证书是对持证人在 Oracle 数据库管理、安装、配置、性能调优、备份恢复等方面专业知识和技能的权威认证。它要求考生通过一系列严格的考试,包括理论知识和实际操作能力的考核,以证明其具备扎实的 Oracle 数据库专业知识和…...
1022 Digital Library
1022 Digital Library 分数 30 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an u…...
基于Python的PC控制Robot 小程序开发历程
1、Background:用万能语言Python进行Robot 的控制一直以来是我想做的事,刚好有机会付诸实践。Just Do It~ 2、Python 代码编写: import socket import time HOST "192.168.0.1" #IP PORT 2008 #Por…...
Coze平台技术解析:零代码AI开发与智能体应用实践
【资源软件】 伏脂撺掇蒌葶苘洞座 /835a36NvQn😕 链接:https://pan.quark.cn/s/5180c62aacf7 「微信被删好友检测工具」筷莱坌教狴犴狾夺郝 链接:https://pan.quark.cn/s/fe4976448ca1 HitPaw Watermark Remover 链接:https://pan…...
在 K8s 上构建和部署容器化应用程序(Building and Deploying Containerized Applications on k8s)
在 Kubernetes 上构建和部署容器化应用程序 Kubernetes 是一个用于管理容器化工作负载和服务的开源平台。它提供了一个强大的框架来自动化部署、扩展和管理容器化应用程序。本博客将指导您完成在 Kubernetes 上构建和部署容器化应用程序的过程,重点介绍技术方面并使…...
【教程】如何使用Labelimg查看已经标注好的YOLO数据集标注情况
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
**Windows 系统**的常用快捷键大全
以下是 Windows 系统的常用快捷键大全,涵盖日常操作、文件管理、窗口控制、系统功能等,助你大幅提升效率: 一、基础系统操作 Win:打开/关闭「开始菜单」Win E:打开「文件资源管理器」Win D:一键显示桌面…...
L1-025 正整数A+B
L1-025 正整数AB L1-025 正整数AB - 团体程序设计天梯赛-练习集 (pintia.cn) 题解 第一次做这道题时,没有注意到num1 和 num2 是在区间 [1, 1000] 内,num1和num2的长度应该是4位数并且num1和num2不能等于0,num1和num2不能大于1000。这两个…...
Go 语言的 map 在解决哈希冲突时,主要使用了链地址法同时参考了开放地址法的思想即每个桶的 8个 key val对是连续的
总结一下 Go map 的哈希冲突解决机制。 1. 哈希表结构: Go 语言的 map 底层有两个主要结构:hmap 和 bmap,它们分别负责管理整个 map 的元数据和存储键值对的桶。 hmap:包含 map 的元数据,如桶的数量、已插入的键值对…...
未支付订单如何释放库存
在电商或交易系统中,处理未支付订单的库存释放是典型的高并发场景问题。以下是结合 Java 技术栈的完整解决方案,涵盖 设计思路、技术实现、容错机制,并基于实际项目经验(如标易行平台的标书资源预约场景)进行分析: 一、核心设计原则 最终一致性:确保库存释放与订单状态的…...
HDFS Full Block Report超限导致性能下降的原因分析
文章目录 前言发现问题失败的为什么是FBR块汇报频率的变化为什么FBR会反复失败HDFS性能下降导致Yarn负载变高的形式化分析理解线程理解IO Wait理解HDFS性能下降导致Yarn负载和使用率增高 引用 前言 我们的Yarn Cluster主要用来运行一批由Airflow定时调度的Spark Job࿰…...
[Java实战经验]链式编程与Builder模式
目录 链式编程Builder模式 链式编程 链式编程(Fluent AP)是一种编程风格,它通过在同一个对象上连续调用多个方法来执行一系列操作(让方法返回对象本身(return this))。这种风格的编程使代码更加…...
TypeScript 快速上手--禹神
TypeScript 快速上手 🪩 禹神:三小时快速上手TypeScript,TS速通教程_哔哩哔哩_bilibili ⼀、TypeScript 简介 TypeScript 由微软开发,是基于 JavaScript 的⼀个扩展语⾔。 TypeScript 包含了 JavaScript 的所有内容,即: TypeScript 是 Jav…...
YOLOv2 快速入门与核心概念:更快、更准的目标检测利器
今天,我们就来聊聊 YOLO 系列的第二代—— YOLOv2,看看它是如何在速度的基础上,进一步提升检测精度的。 目标检测的重要性:让机器“看懂”世界 想象一下,自动驾驶汽车需要实时识别道路上的车辆、行人、交通标志&…...
Differentiable Micro-Mesh Construction 论文阅读
信息 2024 CVPR 论文地址 摘要 本文提出了一个可微分框架,用于将标准网格转换为Micro-mesh( μ \mu μ-mesh)这种非常高效的格式,与以前基于阶段的方法相比,提供了一个整体方案。 本文的框架为高质量的 μ \mu μ 网格生产提供了许多优势&…...
groovy运行poi包处理xlsx文件报NoClassDefFoundError
背景:简单的在java上运行poi包处理xlsx文件,正常解析。使用groovy执行相关xlsx文件解析的程序时,报错。报错日志: java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTExtensionList poi版…...
基于Espressif-IDE的esp32开发
日后填坑 新建工程 基本操作 创建一个工程 编译工程 下载程序 运行成功...
emotn ui桌面软件tv版下载安装教程-emotn ui桌面好用吗
在智能电视和电视盒子的使用场景中,一款出色的桌面软件能显著提升用户体验。Emotn UI桌面软件TV版就是这样一款备受关注的产品,与此同时,乐看家桌面也以其独特功能在市场中占据一席之地。接下来,我们将会详细介绍Emotn UI桌面软件…...
抖音ai无人直播间助手场控软件
获取API权限 若使用DeepSeek官方AI服务,登录其开发者平台申请API Key或Token。 若为第三方AI(如ChatGPT),需通过接口文档获取访问权限。 配置场控软件 打开DeepSeek场控软件,进入设置界面找到“AI助手”或“自动化”…...
机器学习中的距离度量与优化方法:从曼哈顿距离到梯度下降
目录 前言一、曼哈顿距离(Manhattan Distance):二、切比雪夫距离 (Chebyshev Distance):三、 闵可夫斯基距离(Minkowski Distance):小结四、余弦距离(Cosine Distance)五、杰卡德距离(Jaccard Distance)六、交叉验证方法6.1 HoldOut Cross-v…...
在GitHub action中使用添加项目中配置文件的值为环境变量
比如我项目的根目录有一个package.json文件,但是我想在工作流中使用某个值,例如使用version的值,就需要从package.json里面取出来,然后存储到环境变量中,供后续步骤使用这个值。 读值存储 读取项目根目录中的某个jso…...
MCP认证难题破解指南
一、MCP 认证体系与核心挑战 1.1 认证体系解析 MCP(Microsoft Certified Professional)作为微软认证体系的基础,覆盖操作系统、云服务、开发工具等核心领域。2025 年最新认证体系包含以下关键方向: Azure 云服务: 覆盖 Azure 虚拟机、容器化部署、云原生应用开发等核心技…...