[LLM 学习笔记] Transformer 基础

news2024/11/15 17:37:47

Transformer 基础

Transformer 模型架构

在这里插入图片描述

主要组成: Encoder, Decoder, Generator.

Encoder (编码器)

N N N 层结构相同(参数不同)的 EncoderLayer 网络组成.
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel], Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{Out}: [batch\_sz, seq\_len, d_{model}] Out:[batch_sz,seq_len,dmodel]

EncoderLayer: 由一层自注意力 Multi-Head Attention (多头注意力) 子网络, 一层 Position-wise Feed-Forward (基于位置的前馈) 子网络, 以及用于连接子网络的 Residual Connection (残差连接) 和 Layer Normalization (层标准化) 组成.
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

  • 自注意力 Multi-Head Attention 网络: Q, K, V 均来自上一层(Input Embedding/EncoderLayer)网络.
    In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

Decoder (解码器)

N N N 层结构相同(参数不同)的 DecoderLayer 网络组成.
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

DecoderLayer: 由一层自注意力 Masked Multi-Head Attention 子网络, 一层(Encoder-Decoder)注意力 Multi-Head Attention 子网络, 一层 Position-wise Feed-Forward (基于位置的前馈) 子网络, 以及用于连接子网络的 Residual Connection (残差连接) 和 Layer Normalization (层标准化) 组成.
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

  • 自注意力 Masked Multi-Head Attention 网络: Q, K, V 均来自上一层(Output Embedding/DecoderLayer)网络. “Masked” 是通过掩码( [ 1 , s e q _ l e n , s e q _ l e n ] [1,seq\_len,seq\_len] [1,seq_len,seq_len])将后续位置屏蔽, 仅关注需要预测的下一个位置.
    In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]
  • (Encoder-Decoder)注意力 Multi-Head Attention 网络: Q 来自上一层(Masked Multi-Head Attention)网络; K,V 来自 Encoder 的输出 memory.
    In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

Generator (生成器)

[ In : d m o d e l , Out : v o c a b _ s z ] [\text{In}: d_{model}, \text{Out}:vocab\_sz] [In:dmodel,Out:vocab_sz] 的线性网络和 Softmax 操作组成.
y = s o f t m a x ( L i n e a r ( x ) ) = s o f t m a x ( x A T + b ) y = \mathrm{softmax}(\mathrm{Linear}(x))=\mathrm{softmax}(xA^T+b) y=softmax(Linear(x))=softmax(xAT+b)
生成器是按序列顺序一次只输出下一个位置的预测概率.
In : [ b a t c h _ s z , d m o d e l ] , Out : [ b a t c h _ s z , v o c a b _ s z ] \textbf{In}: [batch\_sz, d_{model}], \textbf{Out}: [batch\_sz, vocab\_sz] In:[batch_sz,dmodel],Out:[batch_sz,vocab_sz]

※ Multi-Head Attention

Scaled Dot-Product Attention (缩放点积注意力):
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K ⊤ d k ) V \pmb{\mathrm{Attention}(Q,K,V) = \mathrm{softmax}(\frac{QK^{\top}}{\sqrt{d_k}})V} Attention(Q,K,V)=softmax(dk QK)V
维度变化:

  1. 输入:
    • Q   [ b a t c h _ s z , h , s e q _ l e n , d k ] Q\ [batch\_sz,h,seq\_len,d_k] Q [batch_sz,h,seq_len,dk]
    • K   [ b a t c h _ s z , h , s e q _ l e n , d k ] K\ [batch\_sz,h,seq\_len,d_k] K [batch_sz,h,seq_len,dk], K ⊤   [ b a t c h _ s z , h , d k , s e q _ l e n ] K^{\top}\ [batch\_sz,h,d_k,seq\_len] K [batch_sz,h,dk,seq_len]
    • V   [ b a t c h _ s z , h , s e q _ l e n , d k ] V\ [batch\_sz,h,seq\_len,d_k] V [batch_sz,h,seq_len,dk]
  2. Q K ⊤   [ b a t c h _ s z , h , s e q _ l e n , s e q _ l e n ] QK^{\top}\ [batch\_sz,h,seq\_len,seq\_len] QK [batch_sz,h,seq_len,seq_len]
  3. Q K ⊤ d k \frac{QK^{\top}}{\sqrt{d_k}} dk QK 与 Mask 操作: 不改变形状 [ b a t c h _ s z , h , s e q _ l e n , s e q _ l e n ] [batch\_sz,h,seq\_len,seq\_len] [batch_sz,h,seq_len,seq_len]
  4. s o f t m a x ( Q K ⊤ d k ) \mathrm{softmax}(\frac{QK^{\top}}{\sqrt{d_k}}) softmax(dk QK): 最后一维进行 Softmax 操作, 不改变形状 [ b a t c h _ s z , h , s e q _ l e n , s e q _ l e n ] [batch\_sz,h,seq\_len,seq\_len] [batch_sz,h,seq_len,seq_len]
  5. s o f t m a x ( Q K ⊤ d k ) V \mathrm{softmax}(\frac{QK^{\top}}{\sqrt{d_k}})V softmax(dk QK)V: [ b a t c h _ s z , h , s e q _ l e n , d k ] [batch\_sz,h,seq\_len,d_k] [batch_sz,h,seq_len,dk]
    在这里插入图片描述

完整公式(参考 FlashAttention):
S = τ Q K ⊤ ∈ R N × N S masked = MASK ( S ) ∈ R N × N P = softmax ( S masked ) ∈ R N × N P dropped = dropout ( P , p d r o p ) ] Attention ( Q , K , V ) = O = P dropped V ∈ R N × d \begin{aligned} & S=\tau QK^{\top}\in\mathbb{R}^{N\times N}\\ & S^{\text{masked}}=\text{MASK}(S)\in\mathbb{R}^{N\times N}\\ & P=\text{softmax}(S^{\text{masked}})\in\mathbb{R}^{N\times N}\\ & P^{\text{dropped}}=\text{dropout}(P, p_{drop})]\\ & \text{Attention}(Q,K,V)=O=P^{\text{dropped}}V\in\mathbb{R}^{N\times d} \end{aligned} S=τQKRN×NSmasked=MASK(S)RN×NP=softmax(Smasked)RN×NPdropped=dropout(P,pdrop)]Attention(Q,K,V)=O=PdroppedVRN×d

Multi-Head Attention (多头注意力) 机制:
M u l t i H e a d A t t n ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e   h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) \begin{aligned} MultiHeadAttn(Q,K,V) &= Concat(head_1, ..., head_h)W^O\\ \mathrm{where}\ head_i &= Attention(QW^Q_i, KW^K_i, VW^V_i) \end{aligned} MultiHeadAttn(Q,K,V)where headi=Concat(head1,...,headh)WO=Attention(QWiQ,KWiK,VWiV)

其中, W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v , W O ∈ R h d v × d m o d e l W^Q_i\in\mathbb{R}^{d_{model\times d_k}}, W^K_i\in\mathbb{R}^{d_{model}\times d_k}, W^V_i\in\mathbb{R}^{d_{model}\times d_v}, W^O\in\mathbb{R}^{hd_v\times d_{model}} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv,WORhdv×dmodel
在实现中, W Q = ( W 1 Q , . . . , W h Q ) W^Q=(W^Q_1,...,W^Q_h) WQ=(W1Q,...,WhQ), W K = ( W 1 K , . . . , W h K ) W^K=(W^K_1,...,W^K_h) WK=(W1K,...,WhK), W V = ( W 1 V , . . . , W h V ) W^V=(W^V_1,...,W^V_h) WV=(W1V,...,WhV), W O W^O WO, 由 4 个 [ In : d m o d e l , Out : d m o d e l ] [\text{In}: d_{model}, \text{Out}:d_{model}] [In:dmodel,Out:dmodel] 的线性网络组成, d k = d v = d m o d e l / h d_k=d_v=d_{model}/h dk=dv=dmodel/h

在这里插入图片描述

维度变化:

  1. 输入: X   [ b a t c h _ s z , s e q _ l e n , d m o d e l ] X\ [batch\_sz, seq\_len, d_{model}] X [batch_sz,seq_len,dmodel]
  2. 多头预处理: X   [ b a t c h _ s z , s e q _ l e n , d m o d e l ] X\ [batch\_sz, seq\_len, d_{model}] X [batch_sz,seq_len,dmodel] X   [ b a t c h _ s z , h , s e q _ l e n , d k ] X\ [batch\_sz,h,seq\_len,d_k] X [batch_sz,h,seq_len,dk]
  3. 注意力机制: X   [ b a t c h _ s z , h , s e q _ l e n , d k ] X\ [batch\_sz,h,seq\_len,d_k] X [batch_sz,h,seq_len,dk] Q , K , V   [ b a t c h _ s z , h , s e q _ l e n , d k ] Q,K,V\ [batch\_sz,h,seq\_len,d_k] Q,K,V [batch_sz,h,seq_len,dk] A t t e n t i o n ( Q , K , V )   [ b a t c h _ s z , h , s e q _ l e n , d k ] \mathrm{Attention}(Q,K,V)\ [batch\_sz,h,seq\_len,d_k] Attention(Q,K,V) [batch_sz,h,seq_len,dk]
  4. 拼接多头结果: C o n c a t ( h e a d 1 , . . . , h e a d h )   [ b a t c h _ s z , h , s e q _ l e n , d k ] Concat(head_1, ..., head_h)\ [batch\_sz,h,seq\_len,d_k] Concat(head1,...,headh) [batch_sz,h,seq_len,dk]
  5. 输出: M u l t i H e a d A t t n ( Q , K , V )   [ b a t c h _ s z , s e q _ l e n , d m o d e l ] MultiHeadAttn(Q,K,V)\ [batch\_sz, seq\_len, d_{model}] MultiHeadAttn(Q,K,V) [batch_sz,seq_len,dmodel]

Position-wise Feed-Forward

F F N ( x ) = L i n e a r 2 ( R e L U ( L i n e a r 1 ( x ) ) ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 \mathrm{FFN}(x)=\mathrm{Linear}_2(\mathrm{ReLU}(\mathrm{Linear}_1(x)))=\max(0, xW_1 + b_1) W_2 + b_2 FFN(x)=Linear2(ReLU(Linear1(x)))=max(0,xW1+b1)W2+b2

L i n e a r 1 ( x ) \mathrm{Linear}_1(x) Linear1(x) : [ In : d m o d e l ,  Out : d f f ] [\text{In}:d_{model},\ \text{Out}:d_{ff}] [In:dmodel, Out:dff]
L i n e a r 2 ( x ) \mathrm{Linear}_2(x) Linear2(x) : [ In : d f f ,  Out : d m o d e l ] [\text{In}:d_{ff},\ \text{Out}:d_{model}] [In:dff, Out:dmodel]
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

Add&Norm

论文中: (post-Norm)
S u b l a y e r C o n n e c t i o n ( X ) = L a y e r N o r m ( X + S u b l a y e r ( X ) ) \mathrm{SublayerConnection}(X)= \mathrm{LayerNorm}(X +\mathrm{Sublayer}(X)) SublayerConnection(X)=LayerNorm(X+Sublayer(X))

AnnotatedTransformer 实现中: (pre-Norm)
S u b l a y e r C o n n e c t i o n ( X ) = X + S u b l a y e r ( L a y e r N o r m ( X ) ) \mathrm{SublayerConnection}(X)= X+\mathrm{Sublayer}(\mathrm{LayerNorm}(X)) SublayerConnection(X)=X+Sublayer(LayerNorm(X))

In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

其中:

  • S u b l a y e r ∈ { M u l t i H e a d A t t n , F F N } \mathrm{Sublayer}\in\{\mathrm{MultiHeadAttn},\mathrm{FFN}\} Sublayer{MultiHeadAttn,FFN}
  • 层标准化 L a y e r N o r m ( X ) \mathrm{LayerNorm}(X) LayerNorm(X): 对张量 X X X最后一维( d m o d e l d_{model} dmodel 维, 表示每个样本) x = X [ b , p o s , : ] ∈ R d m o d e l x=X[b,pos,:]\in\mathbb{R}^{d_{model}} x=X[b,pos,:]Rdmodel 进行标准化.
    N o r m ( x ) = x − E ( x ) S D ( x ) + ϵ ∗ γ + β \mathrm{Norm}(x)=\frac{x-E(x)}{SD(x)+\epsilon}*\gamma+\beta Norm(x)=SD(x)+ϵxE(x)γ+β. 其中, E ( x ) E(x) E(x) 为平均值(期望), S D ( x ) SD(x) SD(x) 为标准差, γ , β ∈ R d m o d e l \gamma,\beta\in\mathbb{R}^{d_{model}} γ,βRdmodel 为可学习的参数, ϵ \epsilon ϵ 是用于数值稳定性(避免除 0)在分母上加的一个极小值标量.
  • 残差连接 (Residual Connection): y = x + F ( x ) y=x+\mathcal{F}(x) y=x+F(x)
  • 注: pre-Norm 与 post-Norm 的区别, 参考: 【重新了解Transformer模型系列_1】PostNorm/PreNorm的差别 - 知乎

Token Embedding

大小为 v o c a b _ s z vocab\_sz vocab_sz 嵌入维度为 d m o d e l d_{model} dmodel 的查询表(lookup table).
In : [ b a t c h _ s z , s e q _ l e n ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len],Out:[batch_sz,seq_len,dmodel]
E m b e d d i n g ( x ) = l u t ( x ) ⋅ d m o d e l \mathrm{Embedding(x)} = \mathrm{lut}(x)\cdot\sqrt{d_{model}} Embedding(x)=lut(x)dmodel

Positional Encoding

用于
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d model ) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d model ) \begin{aligned} &PE_{(pos,2i)} = \sin(pos / 10000^{2i/d_{\text{model}}})\\ &PE_{(pos,2i+1)} = \cos(pos / 10000^{2i/d_{\text{model}}}) \end{aligned} PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

P E ( X ) = X + P ,  where  ( p ( b , p o s , i ) ) = P ,   p ( b , p o s , i ) = P E ( p o s , i ) \mathrm{PE}(X)=X+ P,\ \text{where}\ (p_{(b,pos,i)})=P,\ p_{(b,pos,i)} = PE_{(pos,i)} PE(X)=X+P, where (p(b,pos,i))=P, p(b,pos,i)=PE(pos,i)

其中, X , P ∈ R b a t c h _ s z × s e q _ l e n × d m o d e l X,P\in\mathbb{R}^{batch\_sz\times seq\_len\times d_{model}} X,PRbatch_sz×seq_len×dmodel, 即 X X X P P P [ b a t c h _ s z , s e q _ l e n , d m o d e l ] [batch\_sz,seq\_len,d_{model}] [batch_sz,seq_len,dmodel] 形状的张量; p ( b , p o s , i ) p_{(b,pos,i)} p(b,pos,i) P P P 对应位置的元素, p o s pos pos 为 token 在 s e q _ l e n seq\_len seq_len 长度的序列中位置, i i i d m o d e l d_{model} dmodel 中的维度.
In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] , Out : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}], \textbf{Out}: [batch\_sz, seq\_len, d_{model}] In:[batch_sz,seq_len,dmodel],Out:[batch_sz,seq_len,dmodel]

Subsequent Mask

也称为 “Causal Attention Mask”, 因果注意力掩码("FlashAttention"中的说法). 用于 Decoder 的注意力网络中屏蔽预测位置之后的信息, 即仅根据预测位置及之前的信息进行预测.
掩码应用于矩阵 Q K T / d k QK^T/\sqrt{d_k} QKT/dk , 是一个包括对角线的下三角矩阵(对应保留 Q Q Q s e q _ l e n seq\_len seq_len 索引 i i i 大于等于 K T K^T KT s e q _ l e n seq\_len seq_len 索引 j j j 的计算结果), 将掩码为 0 部分(上三角部分为 0)对应的矩阵数据替换为极小值(如 -1e9).
shape : [ 1 , s e q _ l e n , s e q _ l e n ] \text{shape}: [1,seq\_len, seq\_len] shape:[1,seq_len,seq_len]
在这里插入图片描述

代码实现

  • The Annotated Transformer 官方 Colab 代码: AnnotatedTransformer.ipynb
  • 带详细中文注释的 Colab 代码: AnnotatedTransformer.ipynb
  • The Annotated Transformer 官方 GitHub 仓库: harvardnlp/annotated-transformer
  • 带详细中文注释且模型代码分离的 GitHub 仓库: peakcrosser7/annotated-transformer

参考资料

  • Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30. https://dl.acm.org/doi/10.5555/3295222.3295349
  • The Annotated Transformer - Harvard University
  • Self-Attention v/s Attention: understanding the differences | by Nishant Usapkar | Medium
  • Self attention vs attention in transformers | MLearning.ai
  • 【重新了解Transformer模型系列_1】PostNorm/PreNorm的差别 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WorldView系列卫星】

WorldView系列卫星 WorldView系列卫星是美国DigitalGlobe公司推出的一系列先进商业遥感卫星,旨在提供高分辨率的地球成像服务。该系列卫星以其卓越的成像能力,如高分辨率、快速重访时间和宽幅扫描能力,引领了地球观测技术的新标准。以下是对…

LCD1602

LCD1602 是一种工业字符型液晶显示屏,能够同时显示 16x2 即 32 个字符。 LCD的显示控制 通过向 LCD1602 发送指令和数据来控制其显示内容。指令包括清屏、设置光标位置、显示模式等;数据则是要显示的字符的 ASCII 码。LCD1602 内部有一个控制器&#x…

el-form动态标题和输入值,并且最后一个输入框不校验

需求:给了固定的label,叫xx单位,要输入单位的信息,但是属性名称都一样的,UI画图也是表单的形式,所以改为动态添加的形式,实现方式也很简单,循环就完事了,连着表单校验也动…

ChatGLM-6B:部署指南与实战应用全解析

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 SD3ComfyUI文生图部署步骤DAMODEL-ChatGLM-6B 服务端部署1.1、实例创建1.2、模型准备1.3、模型启动 SD3ComfyUI文生图部署步骤 Chat…

centos系统配置本地镜像源

今天在安装docker相关的依赖包时,在centos系统上,发现很多原本的镜像地址,拉取rpm依赖包失败,因为我的centos系统,安装的时候使用的是最小化安装,很多rpm包没有安装好,所以在后续安装一些常规命…

电脑共享同屏的几种方法分享

实时共享屏幕的方法多种多样,适用于不同的设备和场景。以下是几种常见的实时共享屏幕的方法: 1. 使用无线投屏技术 原理:无线投屏技术允许设备通过Wi-Fi网络或其他无线连接方式,将屏幕内容实时投射到另一台设备上。 操作步骤&a…

如何分析开源项目

如何分析开源项目 教程:【狂神说Java】手把手教你如何分析开源项目_哔哩哔哩_bilibili 一.开源项目下载 1.下载 因为GitHub下载太慢了,下载完毕进行解压。 后端:eladmin: eladmin-jpa 版本:项目基于 Spring Boot 2.1.0 、 Jpa、…

如何在openEuler上安装和配置openGauss数据库

本文将详细介绍如何在openEuler 22.03 LTS SP1上安装和配置openGauss数据库,包括数据库的启动、停止、远程连接配置等关键步骤。 1、安装 使用OpenEuler-22.03-LTS-SP1-x64版本的系统,通过命令行安装openGauss数据库。 1.1、确保系统软件包索引是最新…

Anaconda安装保姆级教程

1.下载Anaconda 可以在官网下载地址链接: Anaconda官网 推荐:清华大学镜像 2.安装 推荐,允许其他程序,如VSCode、PyCham等自动检测anaconda作为系统上的主Python。 3.配置环境变量 D:\Anaconda3为安装路径 D:\Anaconda3 D:\Anaconda3\S…

HT6819 3.3W带数字音量控制/防削顶低EMI立体声D类音频功率放大器

特点 降低了内阻和热耗的EDMA专利技术,极大提升了 输出功率和产品可靠性 Po3.3 W(VDD5.0V,RL4Ω,THDN10%) Po1.7 W(VDD3.6V,RL4Ω,THDN10%) 优异的全带宽EMI抑制性能 a)独创的主动边沿控制专利(AROC,Active edge Ringing and Overshoot Control circuitr…

monaco-editor基本使用

前言 公司项目需要代码编辑器,多方参考之后用了monaco-editor。 一、monaco-editor是什么? Monaco Editor 是微软开源的基于 VS Code 的代码编辑器,运行在浏览器环境中。 二、使用步骤 1.npm下载插件 //我下载的版本 npm i monaco-edit…

Java_Day05学习

Object类被子类经常重写的方法 方法说明toString()返回当前对象本身的有关信息,按字符串对象返回equals()比较两个对象是否是同一个对象,是则返回****truehashCode()返回该对象的哈希代码值getClass()获取当前对象所属的类信息,返回Class对象…

使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统

要使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统,您可以按以下步骤进行。这个系统将利用 Loki 作为日志存储和聚合系统,Loki4j 作为 Java 的日志插件,Grafana 用于日志的可视化。 1.工具介绍&…

中兴数通产品厉害了,获得CC EAL3+认证!

不知道朋友们最近听说没有,中兴的数通产品是真争气,有25款成功通过了国际信息技术安全评估通用准则CC的EAL 3级别认证。中兴一直是通讯行业的领先企业,这次CC EAL 3级别认证覆盖了多款主流设备型号,证明了它在网络安全领域的实力确…

TraceId在线程池及@Async异步线程中如何传递

何时使用线程池 提起线程池相信大家都不陌生,什么情况下会考虑使用线程池呢?我总结了一下大概是这么几种情况 第一种情况:程序中有任务需要异步执行。这样不可避免的要分配线程去执行,如果这个异步任务执行的频次很低&#xff0…

模拟实现 string 类的一些常用函数

目录 构造函数 析构函数 拷贝构造 赋值重载 迭代器( begin() 和 end() ) 运算符重载流插入( operator << ( ) ) size() capacity() 运算符重载operator[ ] clear() reserve ( ) push_back ( ) append ( ) 运算符重载 operator ( ) insert ( ) erase ( )…

IO相关流

IO流 一、C语言的输入与输出1、介绍2、输入输出缓冲区&#xff08;1&#xff09;介绍&#xff08;2&#xff09;示意图 二、流1、介绍2、主要特点 三、CIO流1、介绍2、示意图 四、iostream1、介绍2、基本概念3、注意 五、类型转换1、operator bool&#xff08;1&#xff09;介绍…

计算机毕业设计非遗项目网站 登录注册搜索 评论留言资讯 前后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

遗项目网站需求&#xff0c;以下是一个基于Spring Boot、Java Web、J2EE技术栈&#xff0c;使用MySQL数据库&#xff0c;并结合Vue实现前后端分离的简要设计方案&#xff1a; 系统功能概述 ‌用户登录与注册‌&#xff1a;实现用户的注册、登录功能&#xff0c;确保用户信息的…

【Python】PyCharm: 强大的 Python 开发环境

⭕️宇宙起点 &#x1f4e2; 引言&#x1f3ac; 什么是 PyCharm&#xff1f;&#x1f528; PyCharm 的核心特性1. 智能代码编辑2. 调试和测试3. 项目和代码结构导航4. 集成 AI 助手5. 远程开发6. 集成数据库7. 科学工具8. 版本控制集成9. Web 开发 &#x1f4e6; 安装 PyCharm&…

【NLP】daydayup 词向量训练模型word2vec

词嵌入算法 word2vec word2vec是一种高效训练词向量的模型&#xff0c;基本出发点是上下文相似的两个词。它们的词向量也应该相似。一般分为CBOW&#xff08;Continuous Bag-of-Words&#xff09;与 Skip-Gram CBOW 词袋模型&#xff0c;使用中心词周围的词来预测中心词&…