[论文笔记]GAUSSIAN ERROR LINEAR UNITS (GELUS)

news2024/11/28 5:25:47

引言

今天来看一下GELU的原始论文。

作者提出了GELU(Gaussian Error Linear Unit,高斯误差线性单元)非线性激活函数: GELU = x Φ ( x ) \text{GELU}= x\Phi(x) GELU=xΦ(x),其中 Φ ( x ) \Phi(x) Φ(x)​是标准高斯累积分布函数。与ReLU激活函数通过输入的符号进行门控不同,GELU非线性激活函数通过输入的数值进行加权。

Tags

#ActivateFunction#

总体介绍

随着网络变得更深,使用sigmoid激活函数进行训练的效果不如非平滑、非概率性的ReLU,后者基于输入的符号进行硬门控决策。ReLU通常比sigmoid激活函数能够实现更快更好的收敛性。在ReLU的成功基础上,最近的一种修改称为ELU允许ReLU-like的非线性激活函数输出负值,这有时可以提高训练速度。总之,激活函数选择对于神经网络仍然是一个必要的架构决策,否则网络将成为一个深度线性分类器。

深度非线性分类器能够很好地拟合数据,以至于网络设计者通常需要选择是否包含随机正则化器,例如在隐藏层添加噪声或应用dropout,而这个选择与激活函数是相互独立的。因此,非线性和dropout共同决定了神经元的输出,但这两个创新仍然是不同的。此外,由于流行的随机正则化器不考虑输入,而非线性受到这些正则化器的帮助,因此两者都不会取代对方。

在这篇工作中,作者引入了一种新称为GELU的激活函数。它与随机正则化器有关,因为它是自适应dropout修改的期望。这表明了对神经元输出的更概率性的观点。

补充知识

正态分布与误差函数

本节介绍一些相关知识,以便更好地理解这篇论文。正态分布的概率密度函数为:
f ( x ) = 1 2 π σ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) (p1) f(x) = \frac{1}{\sqrt{2\pi} \sigma} \exp\left( -\frac{(x-\mu)^2}{2\sigma^2} \right) \tag{p1} f(x)=2π σ1exp(2σ2(xμ)2)(p1)
假设 X X X是随机变量,累积分布函数是概率 P ( X ≤ x ) P(X \leq x) P(Xx),用概率密度函数可以表示为:
F ( x ; μ , σ ) = 1 2 π σ ∫ − ∞ x exp ⁡ ( − ( t − μ ) 2 2 σ 2 ) d t (p2) F(x;\mu,\sigma) = \frac{1}{\sqrt{2\pi} \sigma} \int_{-\infty}^x \exp\left( -\frac{(t-\mu)^2}{2\sigma^2} \right)dt \tag{p2} F(x;μ,σ)=2π σ1xexp(2σ2(tμ)2)dt(p2)
正态分布可记为 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2),其中 μ \mu μ σ 2 \sigma^2 σ2分别代表均值和方差。当 μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0,σ=1时称为标准正态分布。

下图是一些不同取值的概率密度函数图像(左)和累积分布函数图像(右):

image-20240427161126069

误差函数(Error function, erf \text{erf} erf)的定义如下:
erf ( x ) = 1 π ∫ − x x e − t 2 d t = 2 π ∫ 0 x e − t 2 d t (p3) \text{erf}(x) = \frac{1}{\sqrt \pi} \int_{-x}^x e^{-t^2} dt = \frac{2}{\sqrt \pi} \int_0^x e^{-t^2} dt \tag{p3} erf(x)=π 1xxet2dt=π 20xet2dt(p3)
互补误差函数( erfc \text{erfc} erfc),在误差函数的基础上定义:
erfc = 1 − erf ( x ) = 2 π ∫ x ∞ e − t 2 d t (p4) \text{erfc} = 1 - \text{erf}(x) = \frac{2}{\sqrt \pi} \int_x^\infty e^{-t^2} dt \tag{p4} erfc=1erf(x)=π 2xet2dt(p4)
为什么要介绍误差函数,因为它和正态分布式有关系的,重点是作者也引入了它。

误差函数本质上与标准正态累积分布函数 Φ \Phi Φ(将 μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0,σ=1代入式p2)是等价的:
Φ ( x ) = 1 2 π ∫ − ∞ x exp ⁡ ( − t 2 2 ) d t = 1 2 [ 1 + erf ( x 2 ) ] = 1 2 erfc ( − x 2 ) (p5) \Phi(x) =\frac{1}{\sqrt{2\pi}} \int_{-\infty}^x \exp\left( -\frac{t^2}{2} \right)dt = \frac{1}{2}\left[1+ \text{erf}\left( \frac{x}{\sqrt 2}\right) \right ] = \frac{1}{2} \text{erfc} \left(-\frac{x}{\sqrt 2} \right)\tag{p5} Φ(x)=2π 1xexp(2t2)dt=21[1+erf(2 x)]=21erfc(2 x)(p5)
可整理为如下形式:
erf ( x ) = 2 Φ ( x 2 ) − 1 erfc ( x ) = 2 Φ ( − x 2 ) = 2 ( 1 − Φ ( x 2 ) ) \begin{aligned} \text{erf}(x) &= 2\Phi(x\sqrt 2) -1 \\ \text{erfc}(x) &= 2\Phi(-x\sqrt 2) = 2(1-\Phi(x\sqrt 2)) \end{aligned} erf(x)erfc(x)=(x2 )1=(x2 )=2(1Φ(x2 ))

关于泰勒展开可以参考——人工智能数学基础之高等数学。

误差函数泰勒展开收敛:
erf ( z ) = 2 π ∑ n = 0 ∞ ( − 1 ) n z 2 n + 1 n ! ( 2 n + 1 ) = 2 π ( z − z 3 3 + z 5 10 − z 7 42 + z 9 216 − ⋯   ) (p6) \text{erf}(z) = \frac{2}{\sqrt \pi} \sum_{n=0}^\infty \frac{(-1)^n z^{2n+1}}{n!(2n+1)} =\frac{2}{\sqrt \pi} \left(z - \frac{z^3}{3} + \frac{z^5}{10} - \frac{z^7}{42} + \frac{z^9}{216} - \cdots \right) \tag{p6} erf(z)=π 2n=0n!(2n+1)(1)nz2n+1=π 2(z3z3+10z542z7+216z9)(p6)
误差函数和 tanh ⁡ \tanh tanh的关系:
erf ( x ) ≈ tanh ⁡ ( 2 π ( x + 11 123 x 3 ) ) (p7) \text{erf}(x) \approx \tanh\left(\frac{2}{\sqrt \pi} \left(x +\frac{11}{123}x^3 \right) \right) \tag{p7} erf(x)tanh(π 2(x+12311x3))(p7)

import numpy as np
import matplotlib.pyplot as plt
import scipy.special

x = np.linspace(-3, 3, 100)

y1 = scipy.special.erf(x)

y2 = np.tanh(2/np.sqrt(np.pi)*(x + 11/123 * x**3))

plt.figure()
plt.plot(x, y1, label='erf(x)')
plt.plot(x, y2, label='tanh(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Plot of erf(x) and tanh(x)')
plt.legend()
plt.grid(True)
plt.show()

image-20240428075759147

当通常如上代码画图,这两个函数的图几乎重叠。

伯努利分布

伯努利分布(Bernoulli distribution),又称为两点分布或0-1分布,是一个离散型概率分布。若伯努利试验成功,则伯努利随机变量取值为1,否则伯努利试验失败,伯努利随机变量取值为0。即其成功概率为 p ( 0 ≤ p ≤ 1 ) p( 0 \leq p \leq 1) p(0p1),失败概率为 q = 1 − p q= 1-p q=1p

其概率质量函数(probability mass function, pmf)为:
f X ( x ) = p x ( 1 − p ) 1 − x = { p if x = 1 q if x = 0 f_X(x) = p^x (1-p)^{1-x} = \begin{cases} p & \text{if x = 1}\\ q & \text{if x = 0} \end{cases} fX(x)=px(1p)1x={pqif x = 1if x = 0
概率质量函数是离散型随机变量在各特定取值上的概率,和概率密度函数的一个不同之处在于:概率质量函数是对离散随机变量定义的,本身代表该值的概率;概率密度函数本身不是概率,只有对连续随机变量的概率密度函数必须在某一个区间内被积分后才能产生出概率。

不同成功概率下的概率质量函数图像:

image-20240427170444091

其期望为:
E [ X ] = ∑ i = 0 1 x i f X ( x ) = 0 + p = p (p6) E[X] = \sum_{i=0}^1 x_i f_X(x) = 0 + p = p \tag {p6} E[X]=i=01xifX(x)=0+p=p(p6)

GELU公式

作者通过结合dropout、zoneout和ReLU的特性来激发出这个激活函数。

首先要注意的是,ReLU和dropout都可以确定地将神经元的输出乘零或一,而dropout则是随机地将其乘零。此外,一种新的RNN正则化器称为zoneout可以通过乘一来随机地乘输入。

作者通过将输入乘零或一来合并这种功能,但是这个零一掩码的值是随机确定的,同时也依赖于输入。具体来说,将神经元的输入 x x x m ∼ Bernoulli ( Φ ( x ) ) m ∼ \text{Bernoulli}(\Phi(x)) mBernoulli(Φ(x)),其中 Φ ( x ) = P ( X ≤ x ) \Phi(x) = P(X ≤ x) Φ(x)=P(Xx) X ∼ N ( 0 , 1 ) X ∼ N(0, 1) XN(0,1)​​​是标准正态分布的累积分布函数。

选择这个分布是因为神经元的输入往往遵循正态分布,尤其是在批归一化的情况下。在这种情况下,随着 x x x的减小,输入“被丢弃”的概率更高,因此应用于 x x x​​的转换是随机的,但取决于输入。

以这种方式屏蔽输入保留了非确定性,但仍然依赖于输入值。随机选择的掩码相当于对输入进行随机的恒等映射(不变)和置零映射。这非常类似于自适应dropout,但自适应dropout与非线性一起使用,并使用逻辑斯蒂分布而不是标准正态分布。作者发现,只使用这种随机正则化器就可以训练出具有竞争力的网络,而不需要使用任何非线性。

我们通常希望神经网络做出确定性的决策,所以激活函数的输出应该是确定的,不能是随机的。为了移除这个随机性,我们可以计算期望:
E [ m x ] = x E [ m ] = x Φ ( x ) E[mx] = x E[m] = x\Phi(x) E[mx]=xE[m]=xΦ(x)
因为 m m m是伯努利分布,根据(p6)我们知道该伯努利分布的期望为 Φ ( x ) \Phi(x) Φ(x)

由于高斯分布的累积分布函数通常使用误差函数计算,因此作者将GELU定义为:
GELU ( x ) = x P ( X ≤ x ) = x Φ ( x ) = x ⋅ 1 2 [ 1 + erf ( x / 2 ) ] \text{GELU} (x) = x P(X \leq x) = x\Phi(x) = x \cdot \frac{1}{2} \left[1 + \text{erf}(x / \sqrt 2) \right] GELU(x)=xP(Xx)=xΦ(x)=x21[1+erf(x/2 )]
这里可以参考(p5)。

image-20240427172743948

其对应的函数图像可以参考上图的蓝线。从其图像可以看出,在负值区域,不像 ReLU \text{ReLU} ReLU全为0,并且是光滑地、处处可导的。

在HuggingFace的transformers库中的实现为如下:

class GELUActivation(nn.Module):
    """
    Original Implementation of the GELU activation function in Google BERT repo when initially created. For
    information: OpenAI GPT's GELU is slightly different (and gives slightly different results): 0.5 * x * (1 +
    torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3)))) This is now written in C in nn.functional
    Also see the Gaussian Error Linear Units paper: https://arxiv.org/abs/1606.08415
    """

    def __init__(self, use_gelu_python: bool = False):
        super().__init__()
        if use_gelu_python:
            self.act = self._gelu_python
        else:
            self.act = nn.functional.gelu

    def _gelu_python(self, input: Tensor) -> Tensor:
        return input * 0.5 * (1.0 + torch.erf(input / math.sqrt(2.0)))

    def forward(self, input: Tensor) -> Tensor:
        return self.act(input)

可以看到这里提供了两种实现,一种是直接通过上面的公式实现——_gelu_python();从注释中可以看出,还有一种是基于0.5 * x * (1 +torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3))))的近似实现,通过C来实现,默认是采用这种方式。

后者是为了加速计算,第一种实现时精确求解。作者有指出可以近似GELU为
0.5 x ( 1 + tanh ⁡ [ 2 / π ( x + 0.044715 x 3 ) ] ) 0.5 x(1+ \tanh[\sqrt{2/\pi} (x + 0.044715x^3)]) 0.5x(1+tanh[2/π (x+0.044715x3)])


x σ ( 1.702 x ) x\sigma(1.702 x) xσ(1.702x)
甚至如果更快的前馈网络速度的价值超过了准确性的代价,还可以使用不同的累积分布函数。例如,我们可以使用逻辑斯蒂分布的累积分布函数 σ ( x ) σ(x) σ(x)来得到所谓的Sigmoid线性单元(Sigmoid Linear Unit, SiLU):
SiLU = x σ ( x ) \text{SiLU} = x\sigma(x) SiLU=xσ(x)
也可以使用 N ( μ , σ 2 ) N(\mu, σ^2) N(μ,σ2)的累积分布函数,并让µ和σ成为可学习的超参数,但在这项工作中,只简单地让 μ = 0 \mu= 0 μ=0 σ = 1 σ = 1 σ=1​。

近似推导

从补充知识中我们看到了 erf ( x ) ≈ tanh ⁡ ( 2 π ( x + 11 123 x 3 ) ) \text{erf}(x) \approx \tanh\left(\frac{2}{\sqrt \pi} \left(x +\frac{11}{123}x^3 \right) \right) erf(x)tanh(π 2(x+12311x3))​。下面我们利用泰勒展开证明一下。

tanh ⁡ x \tanh x tanhx的泰勒展开为:
tanh ⁡ x = ∑ n = 1 ∞ 2 2 n ( 2 2 n − 1 ) B 2 n x 2 n − 1 ( 2 n ) ! = x − x 3 3 + 2 x 5 15 − 17 x 7 315 + ⋯ \tanh x = \sum^{\infty}_{n=1} \frac{2^{2n}(2^{2n}-1)B_{2n}x^{2n-1}}{(2n)!}= x -\frac{x^3}{3} + \frac{2x^5}{15} - \frac{17x^7}{315} + \cdots tanhx=n=1(2n)!22n(22n1)B2nx2n1=x3x3+152x531517x7+
假设我们不知道式(p7)中的具体数值。我们考虑近似形式 tanh ⁡ ( a x + b x 3 ) \tanh (ax+bx^3) tanh(ax+bx3)以及 GELU \text{GELU} GELU中的形式,在 x = 0 x=0 x=0​处展开

考虑 tanh ⁡ ( a x + b x 3 ) \tanh (ax+bx^3) tanh(ax+bx3)的泰勒展开:
a x + b x 3 − ( a 3 3 x 3 + b 3 x 6 3 ) + ⋯ ax + bx^3 - (\frac{a^3}{3}x^3 + \frac{b^3x^6}{3}) + \cdots ax+bx3(3a3x3+3b3x6)+
我们仅考虑前两项,即令同幂次前的系数相等:
erf ( x 2 ) − tanh ⁡ ( a x + b x 3 ) = ( 2 π − a ) x + ( a 3 3 − b − 1 3 2 π ) x 3 \text{erf}(\frac{x}{\sqrt 2}) - \tanh(ax+bx^3) = \left( \sqrt \frac{ 2}{ \pi} -a \right)x +\left(\frac{a^3}{3} -b -\frac{1}{3\sqrt {2\pi}} \right)x^3 erf(2 x)tanh(ax+bx3)=(π2 a)x+(3a3b32π 1)x3
得到两个方程,求解得到

a = 2 π , b = 4 − π 3 2 π 3 / 2 a = \sqrt \frac{2}{\pi},\quad b=\frac{4-\pi}{3\sqrt 2\pi^{3/2}} a=π2 ,b=32 π3/24π

代入GELU中的 x Φ ( x ) x\Phi(x) xΦ(x),得到

x Φ ( x ) ≈ 1 2 x [ 1 + tanh ⁡ ( 2 π ( x + 0.0455399 x 3 ) ) ] \begin{equation}x\Phi(x)\approx \frac{1}{2} x\left[1 + \tanh\left(\sqrt{\frac{2}{\pi}}\left(x + 0.0455399 x^3\right)\right)\right]\end{equation} xΦ(x)21x[1+tanh(π2 (x+0.0455399x3))]

这个值很接近 0.044715 0.044715 0.044715,因为我们仅做了前两项的近似,所以得到的这个值与真实值存在误差,注意的是作者提出的也是一种近似,也存在误差。这种做法仅考虑局部误差,即在 x = 0 x=0 x=0的局部会比较精确。

因此我们还需要考虑全局误差。

我们固定 a = 2 π a=\sqrt{\frac{2}{\pi}} a=π2 ,这个 a a a是一阶局部近似,我们希望保留在这个近似。同时希望 b b b尽可能帮我们减少全局误差。所以我们可以求解:
min ⁡ b max ⁡ x ∣ erf ( x 2 ) − tanh ⁡ ( a x + b x 3 ) ∣ \begin{equation}\min_{b} \max_x \left|\text{erf}\left(\frac{x}{\sqrt{2}}\right)-\tanh\left(a x + b x^3\right)\right|\end{equation} bminxmax erf(2 x)tanh(ax+bx3)
通过参考2中给出的代码来求解:

import numpy as np
from scipy.special import erf
from scipy.optimize import minimize
# 增加设置显示精度
np.set_printoptions(precision=20)

def f(x, b):
    a = np.sqrt(2 / np.pi)
    return np.abs(erf(x / np.sqrt(2)) - np.tanh(a * x + b * x**3))

def g(b):
    return np.max([f(x, b) for x in np.arange(0, 4, 0.001)])

options = {'xtol': 1e-10, 'ftol': 1e-10, 'maxiter': 100000}
result = minimize(g, 0, method='Powell', options=options)
print(result.x)
[0.035677337314877496]

代入 x Φ ( x ) x\Phi(x) xΦ(x),得到:

x Φ ( x ) ≈ 1 2 x [ 1 + tanh ⁡ ( 2 π ( x + 0.04471491123850979 x 3 ) ) ] \begin{equation}x\Phi(x)\approx \frac{1}{2} x\left[1 + \tanh\left(\sqrt{\frac{2}{\pi}}\left(x + 0.04471491123850979 x^3\right)\right)\right]\end{equation} xΦ(x)21x[1+tanh(π2 (x+0.04471491123850979x3))]

怎么代入呢,因为上式提出了一个 2 π \sqrt{\frac{2}{\pi}} π2 ,所以让 0.035677337314877496 × π 2 0.035677337314877496 \times \sqrt \frac{\pi}{2} 0.035677337314877496×2π 即可:

import math

math.sqrt(math.pi /2) * 0.035677337314877496
0.04471491123850979

此时得到的结果比论文中的 0.044715 0.044715 0.044715更加精确。

本篇工作中还提出了一种近似,即 x σ ( 1.702 x ) x\sigma(1.702 x) xσ(1.702x),它是直接用 σ ( b x ) \sigma(bx) σ(bx)全局逼近 Φ ( x ) \Phi(x) Φ(x)的结果,即
min ⁡ λ max ⁡ x ∣ Φ ( x ) − σ ( b x ) ∣ \begin{equation}\min_{\lambda}\max_{x}\left|\Phi(x) - \sigma(b x)\right|\end{equation} λminxmaxΦ(x)σ(bx)
修改下上面的代码:

import numpy as np
from scipy.special import erf
from scipy.optimize import minimize
from scipy.special import expit


np.set_printoptions(precision=20)

def f(x, b):
    return np.abs(0.5*(1+erf(x / np.sqrt(2))) - 1/(1 + np.exp(-b*x)))

def g(b):
    return np.max([f(x, b) for x in np.arange(0, 4, 0.001)])

options = {'xtol': 1e-10, 'ftol': 1e-10, 'maxiter': 100000}
result = minimize(g, 0, method='Powell', options=options)
print(result.x)
[1.7017449256323682]


Φ ( x ) ≈ σ ( 1.7017449256323682 x ) \begin{equation}\Phi(x)\approx \sigma(1.7017449256323682 x)\end{equation} Φ(x)σ(1.7017449256323682x)

实验

讨论

通过实验证明,GELU表现优于先前的非线性激活函数,但在其他方面与ReLU和ELU相似。例如,当 σ → 0 σ → 0 σ0 μ = 0 \mu = 0 μ=0时,GELU变成了ReLU。此外,ReLU和GELU在渐进上是相等的。实际上,可以将GELU视为平滑ReLU的一种方式。

GELU和之前的激活函数比有几个显著的区别。这个非凸非单调函数在正域不是线性的,并且在所有点上都表现出曲率。而ReLU和ELU是凸函数和单调激活函数,在正域中是线性的,因此可能缺乏曲率。因此,增加曲率和非单调性可能使GELU比ReLU或ELU更容易逼近复杂的函数。此外,由于 ReLU ( x ) = x 1 ( x > 0 ) \text{ReLU}(x) = x\Bbb 1(x > 0) ReLU(x)=x1(x>0) GELU ( x ) = x Φ ( x ) \text{GELU}(x) = x\Phi(x) GELU(x)=xΦ(x),如果 μ = 0 , σ = 1 \mu = 0,σ = 1 μ=0σ=1​,我们可以看到ReLU根据输入的符号对其进行门控,而GELU根据其相对于其他输入的大小对其进行加权。此外,重要的是指出,GELU具有概率解释,因为它是随机正则化器的期望。

结论

本篇工作评估了大量的数据集,证明GELU超越了ELU和ReLU的准确率。

总结

⭐ 作者提出了一种新的激活函数——GELU,根据输入相对于其他输入的大小对其进行加权。即随着输入 x x x的减小,输入“被丢弃”的概率更高,因此应用于 x x x的置零或置一变换是随机的,但取决于输入。

参考

  1. 维基百科
  2. 苏剑林. (Mar. 26, 2020). 《GELU的两个初等函数近似是怎么来的 》[Blog post]. Retrieved from https://kexue.fm/archives/7309

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

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

相关文章

Spring Web MVC入门(3)——响应

目录 一、返回静态页面 RestController 和 Controller之间的关联和区别 二、返回数据ResponseBody ResponseBody作用在类和方法的情况 三、返回HTML代码片段 响应中的Content-Type常见的取值: 四、返回JSON 五、设置状态码 六、设置Header 1、设置Content…

docker如何生成springboot镜像

1、在springboot的jar包所在的目录下创建Dockerfile文件,此案例的目录为/usr/java Dockerfile的文件内容如下: FROM openjdk:8 LABEL author"zengyanhui" LABEL email"1181159889qq.com" WORKDIR /usr/java/springbootdemo COPY s…

动漫渐显引导页HTML5单页源码

挺不错的动漫渐显引导页,记事本右键打开即可修改~ 动漫渐显引导页HTML5单页源码

重生之我是Nginx服务专家

nginx服务访问页面白色 问题描述 访问一个域名服务返回页面空白,非响应404。报错如下图。 排查问题 域名解析正常,网络通讯正常,绕过解析地址访问源站IP地址端口访问正常,nginx无异常报错。 在打开文件时,发现无法…

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中,我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题!!! 一、题目讲解 一组非负整数,包…

机器学习的指标评价

之前在学校的小发明制作中,在终期答辩的时候,虽然整个项目的流程都答的很流畅。 在老师提问的过程中,当老师问我recall,precision,accuracy等指标是如何计算的,又能够表示模型的哪方面指标做得好。我听到这个问题的时候&#xff…

信息系统项目管理师0076:应用集成(5信息系统工程—5.3系统集成—5.3.5应用集成)

点击查看专栏目录 文章目录 5.3.5应用集成5.3.5应用集成 随着网络和互联网的发展以及分布式系统的日益流行,大量异构网络及各计算机厂商推出的软、硬件产品分布在分布式系统的各层次(如硬件平台、操作系统、网络协议、计算机应用),乃至不同的网络体系结构上都广泛存在着互操…

10.通用定时器

驱动电机 RGB LED亮度(呼吸灯) 舵机(遥控车、机械臂) 通用定时器作用 1.延时 2.定时器更新中断 3.输出比较(PWM波、驱动IO输出波形(脉冲)) 4.输入捕获&…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题:最近准备使用VMware虚拟机搭建k8s集群服务,因为需要在同一个网段下,我使用桥接的方式,我发现主机在使用有线连接时虚拟机网络连接正常,但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

Codeforces Round 941 (Div. 2)(A-D)

A. Card Exchange(思维 Problem - A - Codeforces 题目大意: 给定n张牌,每次选k张相同的牌,把他们变成k-1张任意的牌,求最后手中最少能有几张牌。 思路: 直接判断这n张牌当中有没有k张一样的牌&#xff0c…

Python快速入门1数据类型(需要具有编程基础)

数据类型: Python 3.0版本中常见的数据类型有六种: 不可变数据类型可变数据类型Number(数字)List(列表)String(字符串)Dictionary(字典)Tuple(元…

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自:Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…

明日周刊-第8期

现在露营的人越来越多了,都是带着帐篷或者遮阳篷聚在一起喝喝茶聊聊天,这是一种很好的放松方式。最近我养了一只金毛,目前两个月大,非常可爱。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、人工智能领域 本周&#xff…

Java面试八股之main方法的参数中字符串数组的第一个元素是什么

Java main方法的参数中字符串数组的第一个元素是什么 Java main 方法的参数中字符串数组的第一个参数通常是指命令行启动Java应用程序时传递给该程序的第一个命令行参数。当您在命令行中执行一个Java应用程序,可以跟随类名后面附加一系列参数,这些参数将…

Debian 系统设置SSH 连接时长

问题现象: 通过finalshell工具连接Debian系统远程操作时,总是一下断开一下断开,要反复重新连接 ,烦人! 解决办法: 找到ssh安装目录下的配置文件:sshd_config vi sshd_config : 找到…

李沐70_bert微调——自学笔记

微调BERT 1.BERT滴哦每一个词元返回抽取了上下文信息的特征向量 2.不同的任务使用不同的特性 句子分类 将cls对应的向量输入到全连接层分类 命名实体识别 1.识别应该词元是不是命名实体,例如人名、机构、位置 2.将非特殊词元放进全连接层分类 问题回答 1.给…

Android --- 常见UI组件

TextView 文本视图 设置字体大小:android:textSize"20sp" 用sp 设置颜色:android:textColor"#00ffff" 设置倍距(行距):android:lineSpacingMultiplier"2" 设置具体行距:android:lineSpacingExtra&q…

闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法

前言 除了使用 ASP.NET Core 内置框架来校验数据,事实上,通过很多第三方框架校验数据,更具优势。 比如 FluentValidation,FluentValidation 是第三方的数据校验框架,具有许多优势,是开发人员首选的数据校验…

kyuubi、sparksql部署实战与连接

一、下载spark和kyuubi的软件包 spark官网下载 https://spark.apache.org/downloads.html kyuubi官网下载 https://www.apache.org/dyn/closer.lua/kyuubi/kyuubi-1.9.0/apache-kyuubi-1.9.0-bin.tgz 二、部署spark 1、spark配置spark-env.sh YARN_CONF_DIR/opt/cloudera…

大象机器人开源协作机械臂myCobot 630 全面升级!

1. 开篇概述 在快速发展的机器人技术领域中,Elephant Robotics的myCobot 600已经证明了其在教育、科研和轻工业领域的显著适用性。作为一款具备六自由度的机械臂,myCobot 600以其600mm的工作半径和2kg的末端负载能力,满足了多样化的操作需求。…