深度学习系统学习系列【2】之人工神经网络(ANN)
文章目录
- 说明
- 人工神经网络概述
- 基本单位(神经元模型)
- 神经元基本模型
- 线性模型与激活函数
- 多层神经网络
- 人工神经网络的注意内容
- 人工神经网络的阶段划分
- 训练阶段
- 输入、输出数据量化的设计
- 权值向量W和偏置b的设计
- 预测阶段
- 人工神经网络核心算法
- 梯度下降算法
- 向前传播算法
- 反向传播算法(Back Propagation)
- 计算图
- BP 算法
- 反向传播算法流程
- 反向传播算法的实现
说明
- 文章属于个人学习笔记内容,仅供学习和交流。
- 内容参考深度学习原理与实践》陈仲铭版和个人学习经历和收获而来。
人工神经网络概述
- 人工神经网络(Artifical Neural Network, ANN )是深度学习的基础。人工神经网络是深度神经网络中最经典,也是最基础的网络模型
- 人工神经网络以其独特的网络结构和处理信息的方法,在自动控制领域、组合优化问题、模式识别、图像处理、自然语言处理等诸多领域,己经取得了辉煌的成绩。
基本单位(神经元模型)
- 人工神经网络是生物神经网络的一种模拟和近似。它从结构、实现机理和功能上模拟生物神经网络。
- 模拟生物神经元模型的人工神经元模型示例图
- 神经元的输入 x i x_i xi对应生物神经元的树突。输入 x i x_i xi向细胞体传播脉冲,相当于输入权值参数 w i w_i wi,通过细胞核对输入的数据和权值参数进行加权求和。
- 传播细胞体的脉冲相当于人工神经元的激活函数,最终输出结果 y y y作为下一个神经元的输入。
- 人工神经网络中最基本的处理单元——神经元,主要由连接、求和节点、激活函数组成。
- 连接(Connection): 神经元中数据流动的表达方式。
- 求和结点(Summation Node):对输入信号和权值的乘积进行求和。
- 激活函数(Activate Function): 一个非线性函数,对输出信号进行控制。
神经元基本模型
- 神经元的数学基本表达式
y = f ( ∑ i = 1 n w i x i + b ) = f ( W T X + b ) \begin{align*} y &= f(\sum_{i=1}^{n}w_ix_i+b) \\ &=f(W^TX+b) \end{align*} y=f(i=1∑nwixi+b)=f(WTX+b) - W = [ w 1 , w 2 , . . . , w n ] 为权值向量, X = [ x − 1 , x 2 , . . . , x n ] 为输入向量 W=[w_1,w_2,...,w_n]为权值向量,X=[x-1,x_2,...,x_n]为输入向量 W=[w1,w2,...,wn]为权值向量,X=[x−1,x2,...,xn]为输入向量
- x 1 , x 2 , . . . , x n x_1 , x_2,..., x_n x1,x2,...,xn为输入信号的各个分量.
- w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn为神经元各个突触的权值。
- b为神经元的偏置参数。
- ∑ \sum ∑为求和节点, z = x 1 w 1 + x 2 w 2 + . . . + x − n w n + b = ∑ i = 1 n w i x i + b z=x_1w_1+x_2w_2+...+x-nw_n+b=\sum_{i=1}^{n}w_ix_i+b z=x1w1+x2w2+...+x−nwn+b=∑i=1nwixi+b
- f f f为激活函数, 一般为非线性函数,如Sigmoid、 Tanh 函数等;
- y y y为该神经元的输出。
线性模型与激活函数
- 线性回归模型和分类模型本质上都是将数据进行映射,既可以映射到一个或多个离散的标签上,也可以映射到连续的空间。
- 单个神经元模型在没有加入激活函数时,就是一个线性回归模型,可以把输入的数据映射到一个 n n n维的平面空间中。
- 神经元加入一个非线性函数(激活函数),相当与在神经元中加入非线性因素,使神经元模型更好地解决复杂的数据分布问题。
- 神经元模型不仅可以看作对生物神经元的模拟,而且能够有效处理数学中的非线性数据理。理论上,由多个神经元组合而成的神经网络可以表示成任何复杂的函数。
多层神经网络
- 人工神经网络由多个神经元组合而成,神经元组成的信息处理网络具有并行分布式结构。
- 一个人工神经网络中的每一层的神经元都拥有输入和输出,每一层都是由多个神经元组成。第 l − 1 l-1 l−1层网络神经元的输出是第 l l l层神经元的输入,输入的数据通过神经元上的激活函数来控制输出数值的大小。该输出数值是 一个非线性值,通过激活函数求得数值,根据极限值来判断是否需要激活该神经元。
- 多层人工神经网络(ANN)由输入层、输出层和隐藏层组成。
- 输入层(InputLayer):接收输入信号作为输入层的输入。
- 隐藏层(Hidden Layer/隐层):它介于输入层和输出层之间,是由大量神经元井列组成的网络层,通常一个人工神经网络可以有多个隐层。
- 输出层(Output Layer):信号在神经网络中经过神经元的传输、内积、 激活后,形成输出信号进行输出。
- 如上图,输入层为3 个元素组成的一维向量,隐层有4个节点,因此从输入层到隐层共有 3 × 4 = 12 3×4=12 3×4=12条连接线;输出层是由 2 2 2个元素组成的一维向量,因此从隐层到输出层共有 4 × 2 = 8 4×2=8 4×2=8 条连接线。
人工神经网络的注意内容
- 人工神经网络输入层与输出层的节点数往往是固定的,根据数据本身而设定,隐层数和隐层节点则可以自由指定。
- 人工神经网络模型图中的箭头代表预测过程时数据的流向,与学习训练阶段的数据流动方向不同。
- 人工神经网络的关键不是节点而是连接,每层神经元与下一层的多个神经元相连接,每条连接线都有独自的权重参数。连接线上的权重参数是通过训练得到的。
- 人工神经网络中不同层的节点间使用全连接的方式, 也就是 l − 1 l-1 l−1层的所有节点对于 l l l层的所有节点都会有相互连接。例如当前层有3个节点,下一层4 个节点,那么连接线有 3 × 4 = 12 3×4=12 3×4=12条,共 12 12 12个权重值和 4 4 4个偏置。
人工神经网络的阶段划分
- 深度学习的一般方法分为训练与预测阶段。在训练阶段,准备好原始数据和与之对应的分类标签数据,通过训练得到模型 Ⅰ Ⅰ Ⅰ。在预测阶段,对新的数据套用该模型 Ⅰ Ⅰ Ⅰ,可以预测新输入数据的类别。
训练阶段
输入、输出数据量化的设计
- 在设计人工神经网络模型结构前,我们需要对输入和输出的数据进行量化。假设输入的一条数据的维度(特征)维度为 k k k,输出为 n n n个分类,那么输入层的神经元节点数应设置为 k k k,输出层的神经元节点数应设置为 n n n。
- 输入层的神经元节点数(k)
-
含义:输入层的神经元数量应与每条数据的特征维度一致。
-
例如,若输入是图像(如28×28像素的灰度图),展平后每条数据是一个784维的向量(28×28=784),则输入层需要784个神经元;若输入是表格数据(如年龄、身高、体重等3个特征),则输入层需要3个神经元。
-
为什么不是样本数量(N)? 样本数量(即数据条数)决定训练时的批量大小(batch size),但不会影响网络结构。网络每次处理一条数据时,只关注该数据的特征维度(k)。
- 输出层的神经元节点数(n)
- 含义:输出层的神经元数量应与分类任务的类别数一致。
- 例如,手写数字识别(MNIST)有10类(0~9),输出层需要10个神经元;二分类任务(如猫狗分类)通常用1个神经元(通过sigmoid输出概率)或2个神经元(softmax多分类形式)。
- 任务:鸢尾花分类(4个特征:花萼长/宽、花瓣长/宽;3个类别:山鸢尾、杂色鸢尾、维吉尼亚鸢尾)。
- 输入层:4个神经元(对应4个特征)。
- 输出层:3个神经元(对应3个类别,使用softmax激活)。
- 样本数量:假设有150条数据(N=150),但网络结构不受此影响。
权值向量W和偏置b的设计
- 人工神经网络的训练实际上是通过算法不断修改权值向量W和偏置b,使其尽可能与真实的模型逼近,以使得整个神经网络的预测效果最佳。
- 操作步骤:首先给所有权值向量 W和偏置b赋予随机值,使用这些随机生成的权重参数值来预测训练、数据中的样本。样本的预测值为 y ^ \hat y y^,真实值为y。定义一个损失函数,目标是使预测值 y ^ \hat y y^尽可能接近于真实值y,损失函数就是使神经网络的损失值和尽可能小。其基本公式为:
l o s s f u n t i o n = ( y ^ − y ) 2 loss funtion=(\hat y -y)^2 lossfuntion=(y^−y)2 - 如何改变神经网络中的参数 W W W和 b b b,让损失函数的值最小?
- 实现优化的关键技术=梯度下降 + 反向传播。
- 目标:调整参数(W, b),使损失函数值最小 → 转化为优化问题。
- 方法:
- 梯度下降:沿梯度方向更新参数,逐步降低损失。
- 反向传播:高效计算网络中所有参数的梯度(通过链式法则)。
- 流程: 反向传播求出梯度 → 梯度下降更新参数 → 迭代直至损失收敛。
- 当损失函数收敛到一定程度时结束训练,保存训练后神经网络的参数。
预测阶段
- 完成人工神经网络的训练阶段后,使用保存的参数,将向量化后的预测数据从人工神经网络的输入层开始输入,顺着数据流动的方向在网络中进行计算,直到数据传输到输出层并输出 (一次向前传播〉,就完成一次预测并得到分类结果。
人工神经网络核心算法
- 人工神经网络的三大核心算法(梯度下降算法、向前传播算法、反向传播算法)。
- 神经网络在训练和预测阶段都需要频繁使用向前传播算法,而在训练阶段则多次用到梯度下降算法和反向传播算法。
梯度下降算法
- 梯度下降算法(Gradient Descent)
向前传播算法
- 向前传播(Feed Forward)算法在神经网络的训练和预测阶段会被反复使用,是神经网络中最常见的算法。只需要根据神经网络模型的数据流动方向对输入的数据进行计算,最终得到输出的结果。
- 人工神经网络模型,其输入层有2个节点,隐层、输出层均有3个节点。
- 假设 z i l z_i^{l} zil为第 l l l层网络第 i i i个神经元的输入, w i , j l w_{i,j}^{l} wi,jl为第 l l l层网络第 i i i个神经元到第 l + 1 l+1 l+1层网络中第 j j j个神经元的连接。
z i l = ∑ j = 1 w i , j l x i + b i z_i^{l}=\sum{j=1}w_{i,j}^{l}x_i+b_i zil=∑j=1wi,jlxi+bi
W = [ w 1 , 1 w 1 , 2 w 1 , 3 w 2 , 1 w 2 , 2 w 2 , 3 ] , X = [ x 1 x 2 ] , B = [ b 1 b 2 b 3 ] W = \begin{bmatrix} w_{1,1} & w_{1,2} & w_{1,3} \\ w_{2,1} & w_{2,2} & w_{2,3} \end{bmatrix}, \quad X = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}, \quad B = \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} W=[w1,1w2,1w1,2w2,2w1,3w2,3],X=[x1x2],B= b1b2b3
W T X + B = [ w 1 , 1 w 2 , 1 w 1 , 2 w 2 , 2 w 1 , 3 w 2 , 3 ] [ x 1 x 2 ] + [ b 1 b 2 b 3 ] = [ w 1 , 1 x 1 + w 2 , 1 x 2 w 1 , 2 x 1 + w 2 , 2 x 2 w 1 , 3 x 1 + w 2 , 3 x 2 ] + [ b 1 b 2 b 3 ] = [ ∑ i = 1 2 w i , 1 x i + b 1 ∑ i = 1 2 w i , 2 x i + b 2 ∑ i = 1 2 w i , 3 x i + b 3 ] = [ z 1 z 2 z 3 ] \begin{align*} W^T X + B &=\begin{bmatrix} w_{1,1} & w_{2,1} \\ w_{1,2} & w_{2,2} \\ w_{1,3} & w_{2,3} \end{bmatrix} \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} + \begin{bmatrix} b_{1} \\ b_{2} \\ b_{3} \end{bmatrix} \\ &=\begin{bmatrix} w_{1,1}x_{1} + w_{2,1}x_{2} \\ w_{1,2}x_{1} + w_{2,2}x_{2} \\ w_{1,3}x_{1} + w_{2,3}x_{2} \end{bmatrix} + \begin{bmatrix} b_{1} \\ b_{2} \\ b_{3} \end{bmatrix} \\ &=\begin{bmatrix} \sum\limits_{i=1}^{2} w_{i,1}x_{i} + b_{1} \\ \sum\limits_{i=1}^{2} w_{i,2}x_{i} + b_{2} \\ \sum\limits_{i=1}^{2} w_{i,3}x_{i} + b_{3} \end{bmatrix} \\ &= \begin{bmatrix} z_{1} \\ z_{2} \\ z_{3} \end{bmatrix} \end{align*} WTX+B= w1,1w1,2w1,3w2,1w2,2w2,3 [x1x2]+ b1b2b3 = w1,1x1+w2,1x2w1,2x1+w2,2x2w1,3x1+w2,3x2 + b1b2b3 = i=1∑2wi,1xi+b1i=1∑2wi,2xi+b2i=1∑2wi,3xi+b3 = z1z2z3
- 单层神经网络的向前传播算法可以使用矩阵表达为
a ( l ) = f ( w T x + b ) f 为激活函数, a ( l ) 第 l 层网络的输出矩阵 a^{(l)}=f(w^Tx+b) \\ f为激活函数,a^{(l)}第l层网络的输出矩阵 a(l)=f(wTx+b)f为激活函数,a(l)第l层网络的输出矩阵
def feedForward (intput a, weight, bias) : f = lambda x :l./(l.+np.exp (-x)) #使用 Sigmod 函数作为激活函数return f(np.dot(weight, intput a) +bias)
反向传播算法(Back Propagation)
- 反向传播算法(BP)的提出是为了高效计算神经网络中每个参数的梯度。由于神经网络多层堆叠的结构特点,参数变化会逐层传递并最终影响损失函数。BP算法通过从输出层反向传播误差,利用链式求导法则逐层计算每个参数的梯度。
- 相比其他梯度计算方法,BP算法虽然存在收敛慢、易陷局部最优等缺点,但其计算精度和实用性更优,因此成为现代神经网络训练的主流方法。
- 算法核心思想是:通过计算图跟踪参数,利用链式求导计算损失函数对每个参数(权重w和偏置b)的偏导数 ∂ L / ∂ w ∂L/∂w ∂L/∂w和 ∂ L / ∂ b ∂L/∂b ∂L/∂b。
- 举例说明:类似"传话绘画"游戏,正向传播逐层传递信息产生误差,反向传播则将误差从输出层逐层回传,指导各层参数调整。这种反向误差传播机制正是BP算法的精髓所在。
计算图
-
计算图可以看作一种用来描述计算函数的语言,图中的节点代表函数的操作,边代表函数的输入。
-
f ( x , y , z ) = ( x + y ) z f(x,y,z)=(x+y)z f(x,y,z)=(x+y)z的计算图为:
-
反向传播算法希望通过链式法则得到f的各个参数的梯度: ∂ f / ∂ z , ∂ f / ∂ x , ∂ f / ∂ y \partial f/\partial z,\partial f /\partial x,\partial f/\partial y ∂f/∂z,∂f/∂x,∂f/∂y
-
假设 q = x + y q=x+y q=x+y,则 f = q z = ( x + y ) z f=qz=(x+y)z f=qz=(x+y)z,当 x = − 5 , y = 2 , z = − 6 x=-5,y=2,z=-6 x=−5,y=2,z=−6
∂ f ∂ z = q = − 3 ∂ f ∂ x = ∂ f ∂ q ∂ q ∂ x = z = − 6 ∂ f ∂ y = ∂ f ∂ q ∂ q ∂ y = z = − 6 \frac{\partial f}{\partial z}=q=-3 \\ \frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x}=z=-6 \\ \frac{\partial f}{\partial y}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}=z=-6 ∂z∂f=q=−3∂x∂f=∂q∂f∂x∂q=z=−6∂y∂f=∂q∂f∂y∂q=z=−6
BP 算法
- n l n_l nl:表示网络的层数, n 1 n_1 n1为输入层, n l n_l nl为输出层。
- s l s_l sl:表示第 l l l层网络神经元的个数。
- f f f:表示神经元的激活函数。
- w l w_l wl:表示第 l l l层到第 l + 1 l+1 l+1层的权重矩阵, w ( i , j ) l ∈ R w_{(i,j)}^{l} \in R w(i,j)l∈R表示从 l l l层的第 i i i个神经元第 l + 1 l+1 l+1层第 j j j个神经元之间的权重。
- b ( l ) b^{(l)} b(l):表示第 l l l层的偏置向量,其中 b i ( l ) b_i^{(l)} bi(l)表示 l l l层第 i i i个神经元的偏置。
- z ( l ) z^{(l)} z(l):表示第l层的输入向量。中 z i ( l ) z_i^{(l)} zi(l)为 l l l层第 i i i个神经元的输入。
- a l a^{l} al::表示第 l l l层的输出向量,其中 a i ( l ) a_i^{(l)} ai(l)为 l l l层第 i i i个神经元的输出。
- 当前层神经网络的向前传播公式
a l = f ( z i ) = f ( w l − 1 a l − 1 + b l ) a^l=f(z^i)=f(w^{l-1}a^{l-1}+b^l) al=f(zi)=f(wl−1al−1+bl) - 损失函数
L ( w , b ) = 1 2 ( y − a L ) 2 y 为期望的输出值, a L 为该神经网络的预测输出值,上标 L 为网络的最后一层(输出层) L(w,b)=\frac{1}{2} (y-a^L)^2 \\ y为期望的输出值, a^L为该神经网络的预测输出值, 上标L为网络的最后一层(输出层) L(w,b)=21(y−aL)2y为期望的输出值,aL为该神经网络的预测输出值,上标L为网络的最后一层(输出层) - 反向传播算法是通过改变网络中的权重参数w和偏置b来改变损失函数的方法,目的是计算损失函数L在神经网络中的所有权重w,以及偏置b的梯度 ∂ L / ∂ w \partial L / \partial w ∂L/∂w和 ∂ L / ∂ b \partial L / \partial b ∂L/∂b
- 反向传播的4个基本方程
- 定义第 l l l层的第 i i i个神经元的误差为 δ i l = ∂ L ∂ z i l \delta_i^l=\frac{\partial L}{\partial z_i^l} δil=∂zil∂L
- 定义第 l l l层的第 i i i个神经元的误差为 δ i l = ∂ L ∂ z i l \delta_i^l=\frac{\partial L}{\partial z_i^l} δil=∂zil∂L
方程 | 含义 |
---|---|
δ L = ∇ a L ⊙ f ′ ( z L ) \delta^{L} = \nabla_{a} L \odot f^{\prime}(z^{L}) δL=∇aL⊙f′(zL) | BP1 输出层误差 |
δ l = ( ( w l ) T δ l + 1 ) ⊙ f ′ ( z l ) \delta^{l} = ((w^{l})^{T} \delta^{l+1}) \odot f^{\prime}(z^{l}) δl=((wl)Tδl+1)⊙f′(zl) | BP2 第 l l l 层误差 |
∂ L ∂ b i l = δ i l \frac{\partial L}{\partial b_{i}^{l}} = \delta_{i}^{l} ∂bil∂L=δil | BP3 损失函数关于偏置的偏导 |
∂ L ∂ w i , j l = a j l − 1 δ i l \frac{\partial L}{\partial w_{i,j}^{l}} = a_{j}^{l-1} \delta_{i}^{l} ∂wi,jl∂L=ajl−1δil | BP4 损失函数关于权值的偏导 |
反向传播算法流程
- 输入 (lnput):输入层输入向量x。
- 向前传播 (Feed Forward):计算 z l = w l − 1 a l − 1 + b l , a l = f ( z l ) z^{l}= w^{l-1}a^{l-1} +b^l ,a^l= f(z^l) zl=wl−1al−1+bl,al=f(zl)。
- 输出层误差 (Output Error):根据公式BP1 计算误差向量 δ L = ∇ a L ⊙ f ′ ( z L ) \delta^{L} = \nabla_{a} L \odot f^{\prime}(z^{L}) δL=∇aL⊙f′(zL)
- 反向传播误差 (Backpropagate Error):根据公式 BP2 逐层反向计算每一层的误差 δ l = ( ( w l ) T δ l + 1 ) ⊙ f ′ ( z l ) \delta^{l} = ((w^{l})^{T} \delta^{l+1}) \odot f^{\prime}(z^{l}) δl=((wl)Tδl+1)⊙f′(zl)
- 输出 (Output):根据公式BP3 和 BP4 输出损失函数的偏置
反向传播算法的实现
- 在实现反向传播算法之前,需要定义神经网络的模型架构,即神经网络有多少层、每一层有多少神经元。还需要给出神经网络定义训练的数据和实际的输出。
- 示例代码: network sizes 为用于测试的神经网络的模型架构,该网络一共有3层,输入层有3个神经元,隐层有4个神经元,输出层有2个神经元。
import numpy as np# 定义神经网络的模型架构 [input, hidden, output]
network_sizes = [3, 4, 2]# 初始化该神经网络的参数
sizes = network_sizes
num_layers = len(sizes)
biases = [np.random.randn(h, 1) for h in sizes[1:]] # 每层的偏置(从第2层开始)
weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] # 权重矩阵# 产生训练数据
training_x = np.random.rand(3).reshape(3, 1) # 输入数据 (3维)
training_y = np.array([0, 1]).reshape(2, 1) # 期望输出 (2维)print("training data x: {}, training data y: {}\n".format(training_x, training_y))# 定义损失函数和激活函数、激活函数的求导
def loss_der(network_y, real_y):'''返回损失函数的偏导,损失函数使用 MSEL = 1/2(network_y-real_y)^2delta_l = network_y-real_y'''return network_y - real_ydef sigmoid(z):'''返回Sigmoid函数的值'''return 1.0 / (1.0 + np.exp(-z))def sigmoid_der(z):'''返回Sigmoid函数的导数'''return sigmoid(z) * (1 - sigmoid(z))# 反向传播函数
def backprop(x, y):# 1 初始化网络参数的导数权重w的偏导和偏置b的偏导delta_w = [np.zeros(w.shape) for w in weights]delta_b = [np.zeros(b.shape) for b in biases]# 2 计算网络输出 (前向传播)activation = x # 把输入的数据作为第一次激活值activations = [x] # 激活值列表zs = [] # 存储网络的加权输入值 (z=wx+b)for w, b in zip(weights, biases):z = np.dot(w, activation) + bactivation = sigmoid(z)activations.append(activation)zs.append(z)# 反向传播# BP1 计算输出层误差delta_l = loss_der(activations[-1], y) * sigmoid_der(zs[-1])# BP3 损失函数在输出层关于偏置的偏导delta_b[-1] = delta_l# BP4 损失函数在输出层关于权值的偏导delta_w[-1] = np.dot(delta_l, activations[-2].transpose())delta_l2 = delta_lfor l in range(2, num_layers):# BP2 计算隐藏层误差delta_l2 = np.dot(weights[-l + 1].transpose(), delta_l2) * sigmoid_der(zs[-l])# BP3 损失函数在隐藏层关于偏置的偏导delta_b[-l] = delta_l2# BP4 损失函数在隐藏层关于权值的偏导delta_w[-l] = np.dot(delta_l2, activations[-l - 1].transpose())return delta_w, delta_b
相关文章:
深度学习系统学习系列【2】之人工神经网络(ANN)
文章目录 说明人工神经网络概述基本单位(神经元模型)神经元基本模型线性模型与激活函数多层神经网络人工神经网络的注意内容 人工神经网络的阶段划分训练阶段输入、输出数据量化的设计权值向量W和偏置b的设计 预测阶段 人工神经网络核心算法梯度下降算法…...
《解锁Windows下GCC升级密码,开启高效编程新旅程》
《解锁Windows下GCC升级密码,开启高效编程新旅程》 为什么要升级 Windows 下的 GCC 版本? 在软件开发的动态领域中,GCC 作为一款卓越的编译器,在 Windows 环境下的升级有着重要意义,其影响深远且广泛。 从性能优化的角度来看,新版 GCC 往往在编译速度上有显著提升。随着…...
**Java面试大冒险:谢飞机的幽默与技术碰撞记**
互联网大厂Java求职者面试:一场严肃与搞笑交织的技术盛宴 场景: 互联网大厂面试间 人物: 面试官: 一位严肃的资深架构师,对技术要求严格。谢飞机: 一位搞笑的程序员,技术实力参差不齐。 第一…...
软件检测价格受多种因素影响,你了解多少?
软件检测价格受到多种因素的影响,这对企业来说至关重要,对开发者来说也至关重要,了解软件检测价格能够让企业和开发者更好地进行预算,能够让企业和开发者更好地进行决策。以下为你深入分析相关内容。 检测范围影响软件检测范围的…...
学习黑客风险Risk
一眼纵览 今天 Day 5 我们用 60 分钟打通「风险管理快闪副本」——先用漫画式视角速读两个国际标准(NIST & ISO/IEC 27005),再把抽象概念变身为炫彩 Risk Heat Map,最后亲手填一张迷你 风险登记簿。学完你将能: 讲…...
scikit-learn在监督学习算法的应用
shiyonguyu大家好,我是我不是小upper!最近行业大环境不是很好,有人苦恼别人都开始着手项目实战了,自己却还卡在 scikit-learn 的代码语法上,连简单的示例运行起来都磕磕绊绊。确实,对很多机器学习初学者来说…...
BG开发者日志505:项目总体情况
1、从2024年12月中旬启动,到4月底gameplay部分开发完毕,已经四个半月过去了。 其中大部分内容是3、4两个月中完成的,量产阶段。 预计6月初参加新品节,6月中旬发售(比原计划7月中旬提前一个月)。 --------…...
MySQL 空值处理函数对比:IFNULL、COALESCE 和 NULLIF
IFNULL、COALESCE 和 NULLIF这三个函数都是 MySQL 中处理 NULL 值的函数,但它们的功能和使用场景有所不同: 1. IFNULL(expr, fallback) 功能:两值处理,专为替换 NULL 设计 如果 expr 不是 NULL,返回 expr如果 expr …...
【2025年】MySQL面试题总结
文章目录 1. MySQL 支持哪些存储引擎?默认使⽤哪个?2. MyISAM 和 InnoDB 有什么区别?3. 事务的四大特性?4. 并发事务带来了哪些问题?5. 不可重复读和幻读有什么区别?6. MySQL 事务隔离级别?默认是什么级别࿱…...
Python 数据智能实战 (10):智能商品推荐 - LLM “猜你喜欢”
写在前面 —— 从协同过滤到语义理解:融合 LLM,打造更懂用户心意的个性化推荐 在之前的篇章里,我们已经见证了 LLM 在用户分群、购物篮分析、流失预测、内容生成等多个电商环节的赋能潜力。今天,我们将聚焦于电商平台的“心脏”之一,也是用户体验和商业转化的核心驱动力…...
2025年 蓝桥杯省赛 Python A 组题目
文章目录 A.偏蓝B.IPv6C.2025图形D.最大数字E.倒水F.拼好数G.登山H.原料采购 近期复盘一下 省赛的题目,正所谓知不足方能进步可以在洛谷找到比赛的题目,不过得注意由于python版本的问题,有些代码想要在洛谷上ac的话,需要对应调整代…...
shell(7)
运算符 1.基本介绍 这是shell进行运算的符号,依靠这些标识才能实现我们在脚本中的运算. 2.基本语法 1、$((运算符))或$[运算符]或expr m n 注意: expr运算符间有空格→如果不加空格会被当做一个整体不会进行运算 例子: 3.expr m - n,如果要将expr运算…...
LangChain与MCP:大模型时代的工具生态之争与协同未来
LangChain与MCP:大模型时代的工具生态之争与协同未来 ——从架构差异到应用场景的深度解析 引言 在大模型驱动的AI应用生态中,LangChain与Model Context Protocol (MCP) 代表了两种截然不同的技术路径:前者以灵活的工具链和开发者友好性著称…...
【LLaMA-Factory实战】Web UI快速上手:可视化大模型微调全流程
一、引言 在大模型微调场景中,高效的工具链能显著降低开发门槛。LLaMA-Factory的Web UI(LlamaBoard)提供了低代码可视化平台,支持从模型加载、数据管理到训练配置的全流程操作。本文将结合结构图、代码示例和实战命令,…...
源码编译Qt StateMachine
编译某个项目时报错提示fatal error: QSignalTransition: No such file or directory,是因为qtbase中没有包含StateMachine模块,需要qt/qtscxml.git - SCXML (state machine notation) compiler and related tools 编译安装qtscxml 执行如下步骤&#…...
C++ STL vector高级特性与实战技巧
引言 各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删…...
[Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
[Windows] Kazumi番剧采集 链接:https://pan.xunlei.com/s/VOPLMhEQD7qixvAnoy73NUK9A1?pwdtu6i# Kazumi是一款基于框架; 开发的轻量级番剧采集工具,专为ACG爱好者设计。通过;自定义XPath规则; 实现精准内容抓取,支持多平台(An…...
二种MVCC对比分析
文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS&#x…...
Python蓝桥杯真题代码
以下是一些不同届蓝桥杯Python真题代码示例: 第十四届青少年蓝桥杯python组省赛真题 删除字符串后缀 input_str input("请输入一个字符串:") suffixes (er, ly, ing) for suffix in suffixes: if input_str.endswith(suffix): input_str …...
高中数学联赛模拟试题精选学数学系列第5套几何题
四边形 A B C D ABCD ABCD 的对角线 A C AC AC 与 B D BD BD 互相垂直, 点 M M M, N N N 在直线 B D BD BD 上, 且关于直线 A C AC AC 对称. 设点 M M M 关于直线 A B AB AB, B C BC BC 的对称点分别为 X X X, Y Y Y, 点 N N N 关于直线 C D CD CD, D A DA DA 的…...
【KWDB 创作者计划】Docker单机环境下KWDB集群快速搭建指南
【KWDB 创作者计划】Docker 单机环境下 KaiwuDB集群快速搭建指南 前言一、KWDB介绍1.1 KWDB简介1.2 主要特点1.3 典型应用场景 二、环境介绍2.1 部署环境要求2.2 本地环境规划2.3 本次部署介绍 三、下载容器镜像四、创建相关证书文件4.1 创建部署目录4.2 创建证书文件4.3 查看证…...
基于51单片机和LCD1602、矩阵按键的小游戏《猜数字》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、LCD16022、矩阵按键3、定时器0 四、主函数总结 系列文章目录 前言 用的是普中A2开发板,用到板上的矩阵按键,还需要外接一个LCD1602液晶显示屏。 【单片机】STC89C52RC 【频率】12T11.05…...
从广义线性回归推导出Softmax:理解多分类问题的核心
文章目录 引言:从回归到分类广义线性模型回顾从二分类到多分类Softmax函数的推导建模多类概率基于最大熵原理具体推导步骤Softmax函数的数学形式 Softmax回归模型参数的可辨识性 最大似然估计与交叉熵损失似然函数交叉熵损失梯度计算 Softmax回归的实现要点数值稳定…...
传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
【早期经典版本】 1.10 三英雄传说:2001 年 9 月 28 日热血传奇正式开启公测,这是传奇的第一个版本。游戏中白天与黑夜和现实同步,升级慢,怪物爆率低,玩家需要靠捡垃圾卖金币维持游戏开销,遇到高级别法师…...
云计算-私有云-私有云运维开发
三、私有云运维开发(15) 使用自动化运维工具 Ansible 完成系统的自动化部署与管理。 基于 OpenStack APIs 与SDK,开发私有云运维程序 1.OpenStack Python运维开发:实现镜像管理(7分) 编写Python代…...
hadoop存储数据文件原理
Hadoop是一个开源的分布式计算框架,可以用于存储和处理大规模数据集。Hadoop的存储系统基于Hadoop Distributed File System(HDFS),它的主要原理如下: 数据切块:当用户向HDFS中存储一个文件时,该…...
spring2.x详解介绍
一、核心架构升级 Spring 2.x 是 Spring 框架的重要迭代版本(2006-2009年间发布),其核心改进体现在 模块化设计 和 轻量化配置 上。相较于 1.x 版本,2.x 通过以下方式重构了架构: XML Schema 支持:弃用 D…...
探索Grok-3的高级用法:功能与应用详解
引言 随着人工智能技术的迅猛发展,xAI推出的Grok-3模型以其卓越的性能和创新功能,成为AI领域的新标杆。Grok-3不仅在计算能力上实现了十倍提升,还引入了多种高级模式和实时数据处理能力,适用于学术研究、技术分析、市场洞察等多场…...
PyTorch_张量转换为numpy数组
使用 tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。共享内存会导致张量或者numpy中的其中一个更改后,另外一个会受到影响。 代码 import torch # 张量转换为 numpy 数组 def test01():data_te…...
什么是“原子变量”?
原子变量(std::atomic)在C++中是一个非常关键的机制,特别是在多线程编程中保持数据安全和避免竞争条件。它的设计目标就是让一段操作在多线程环境下变得“原子性”,即不可被中断,保证操作的完整与一致。 一、什么是“原子变量”? 简单来说: 普通变量:在多线程环境中,…...
[Linux开发工具]gcc/g++
C语言文件编译运行 gcc code.c -o mycode gcc -o mycode code.c 预处理 汇编 编译 链接 预处理(进行宏替换/去注释/条件编译/头文件展开) gcc -E code.c -o code.i -E ->从现在开始进行程序的编译,当我们 的程序预处理完毕后,翻译工作,就停下来 code.i预处理之后的结果 …...
【Mytais系列】Type模块:类型转换
MyBatis 的 类型系统(Type System) 是框架处理 Java 类型与数据库类型之间映射的核心模块,它通过 类型处理器(TypeHandler)、类型别名(TypeAlias) 和 类型转换器 等机制,实现了数据库…...
C++类_虚基类
在 C 里,虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生,而这些基类又从同一个基类派生时,派生类会包含多份间接基类的数据副本,这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中…...
【自然语言处理与大模型】使用Xtuner进行模型合并与导出
在上一篇文章中我为大家介绍了Xtuner框架如何进行QLoRA微调,这个框架在微调过后会得到适配器权重文件,它的后缀是.pth。但原模型都是huggingface模型,其后缀是safetensors。所以呢我们在使用这个框架导出模型之前要合并,合并之前要…...
数据结构4.0
大家好,今天是栈的知识点~ 目录 一、栈的概念 1.0 栈的概念 2.0 概念区分 二、栈的方法 1.0 MyStack方法: 2.0 将元素压入栈顶 3.0 移除并返回栈顶元素 4.0 返回栈顶元素但不移除 三、栈的题目 1.0括号匹配 2.0逆波兰表达式求值 3.0 出栈…...
SMT贴片检验标准核心要点与实施规范
内容概要 SMT贴片检验标准是确保电子产品组装质量的核心框架,其核心要点覆盖从原材料到成品的全流程工艺控制。该标准体系以焊点质量、元件定位精度及锡膏印刷检测为技术基线,结合IPC-A-610电子组装验收规范,对PCBA加工中的缺陷类型、判定阈…...
探索 C++23 std::to_underlying:枚举底层值获取的利器
文章目录 引言基本概念作用使用示例与之前方法的对比在 C23 中的意义总结 引言 在 C 的发展历程中,每一个新版本都带来了许多令人期待的新特性和改进,以提升代码的安全性、可读性和可维护性。C23 作为其中的一个重要版本,也不例外。其中&…...
PyTorch学习之张量(Tensor)(一)
1. 张量的基本概念 1.1. 定义与特性 张量是PyTorch中最基础的数据结构,可视为多维数组的泛化形式,支持标量(0维)、向量(1维)、矩阵(2维)及更高维度的数据存储。其核心特性包括&…...
理解数学概念——支集(支持)(support)
1. 支集(support)的定义 在数学中,一个实函数 f 的支集(support)是函数的不被映射到 0 的元素域(即定义域)的子集。若 f 的(定义)域(domain)是一个拓扑空间(即符合拓扑的集合),则 f 的支集则定义为包含( f 的元素域中)不被映射到0的所有点之最小闭集…...
Python 部分内置函数及其用法详解
在 Python 编程的世界里,内置函数是我们强大的 “工具箱”,它们提供了丰富而便捷的功能,帮助我们高效地完成各种任务。本文将带你深入了解这些常用内置函数及其用法,通过简单易懂的实例,让你轻松掌握它们。 一、数据类…...
[蓝桥杯真题题目及解析]2025年C++b组
移动距离(填空)** 小明初始在二维平面的原点,他想前往坐标 (233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动,即沿着 x 轴正方…...
yolov5 train笔记4 roboflow
How to Train a YOLOv5 Model On a Custom Dataset Sign in to Roboflow https://www.youtube.com/watch?vr3Ke7ZEh2Qo 他的ai懂中文的 还是得训练,明天再搞 https://www.youtube.com/watch?vEmYCpbFQ5wo&t2s 很香但是我没有马内...
工作记录 2015-06-01
工作记录 2015-06-01 序号 工作 相关人员 1 修改了FnetFax 修改了iConverter 修改了iCDA 郝 FNSR识别引擎 统计了最近几个星期0223医院的打字和录音的时间比。上周的比值是3.42,是近8个星期中最低的值。和05/03/2015 - 05/09/2015的3.74相比,下降…...
创意Python爱心代码分享
在代码的世界里,程序员以独特方式书写浪漫。他们精心打造的一个个 demo,宛如熠熠星辰。这些 demo 不仅是技术结晶,更饱含对编程的热爱与执着。从简洁的算法示例到复杂的系统雏形,每一行代码都凝聚着思考与智慧。它们被无私分享&am…...
【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means
一、向量化表示的核心概念 1.1 特征空间与向量表示 多维特征表示:通过多个特征维度(如体型、毛发长度、鼻子长短等)描述对象,每个对象对应高维空间中的一个坐标点,来表示狗这个对象,这样可以区分出不同种…...
降维大合集
1. 主成分分析(PCA,Principal Component Analysis) 基本原理 PCA 是一种线性降维方法,其核心思想是: 找到数据中方差最大的方向(称为主成分),并将数据投影到这些方向上。 利用正交变…...
AWS上构建基于自然语言和LINDO API的线性规划与非线性规划的优化计算系统
我想要实现一个通过使用C#、Semantic Kernel库、OpenAI GPT 4的API和附件文档里提到的LINDO API 15.0实现通过中文自然语言提示词中包含LATEX代码输入到系统,通过LINDO API 15.0线性规划与非线性规划的优化计算程序输出计算结果和必要步骤的应用,结果用中…...
26考研 | 王道 | 计算机网络 | 第三章 数据链路层
26考研 | 王道 | 第三章 数据链路层 数据链路层所处的地位 数据链路层 使用 物理层 提供的“比特传输”服务数据链路层 为 网络层 提供服务,将网络层的 IP数据报(分组)封装成帧,传输给下一个相邻结点物理链路:传输介质…...
学习黑客资产威胁分析贴
第一天作业: 完成作业奖励: 🎁 奖励 1 ── Week 2《Web 渗透手册》预览 Day主题关键目标练手靶场 / 工具1HTTP 基础 & Burp 入门抓包、改包、重放PortSwigger Academy:“HTTP basics”2SQL 注入原理手工注入 sqlmapDVWA →…...
CSS元素动画篇:基于当前位置的变换动画(合集篇)
CSS元素动画篇:基于当前位置的变换动画(合集篇) 前言位移效果类元素动画水平抖动效果效果预览代码实现 垂直抖动效果效果预览代码实现 摇头动画效果效果预览代码实现 点头动画效果效果预览代码实现 旋转效果类元素动画摇摆动画效果效果预览代…...