递归神经网络简介

news2024/11/27 22:33:31

一、说明

说起递归神经网络,递归神经网络(RNN)主要包括以下几种类型:

  1. 简单的RNN(Simple RNN):最基本的RNN类型,每个时刻的输出都与前面时刻的状态有关。

  2. 循环神经网络(Recurrent Neural Networks,RNN):在简单RNN的基础上添加可学习的“记忆单元”,可以处理变长的输入序列并且具有时序特征提取的能力。

  3. 长短时记忆网络(Long Short-Term Memory,LSTM):针对普通RNN存在的梯度消失问题,通过引入“门控机制”来控制信息的流动和记忆的更新,强化记忆功能和忘记功能。

  4. 双向循环神经网络(Bidirectional RNN):一种能够同时考虑上下文信息的循环神经网络,将输入序列分别从前向后和从后向前分别输入到两个RNN中,最终将两个RNN输出的结果进行拼接。

  5. 门控循环神经网络(Gated Recurrent Unit,GRU):与LSTM类似,通过引入“门控机制”来控制信息的流动和记忆的更新,但相比LSTM,GRU只有两个门控单元,计算量更小,收敛速度更快。

        本文将它们的演进历史梳理一遍。限于篇幅问题,我们将其分成两个部分描述。

二、递归神经网络简介

RNN,LSTM和GRU细胞。

        如果你想对顺序或时间序列数据(例如,文本、音频等)进行预测,传统的神经网络是一个糟糕的选择。但是为什么?

        在时间序列数据中,当前观测值依赖于先前的观测值,因此观测值并非彼此独立。然而,传统的神经网络认为每个观察都是独立的,因为网络无法保留过去或历史信息。基本上,他们对过去发生的事情没有记忆。

        这导致了递归神经网络(RNN)的兴起,它通过包括数据点之间的依赖关系将记忆的概念引入神经网络。有了这个,可以训练RNN根据上下文记住概念,即学习重复的模式。

        但是RNN是如何实现这种记忆的呢?

        RNN通过细胞中的反馈回路实现记忆。这是RNN和传统神经网络之间的主要区别。反馈循环允许信息在层内传递,而前馈神经网络则信息仅在层之间传递。

        然后,RNN必须定义哪些信息足够相关以保留在内存中。为此,进化了不同类型的RNN:

  • 传统递归神经网络 (RNN)
  • 长期短期记忆循环神经网络 (LSTM)
  • 门控循环单元循环神经网络 (GRU)

        在本文中,我将向您介绍RNN,LSTM和GRU。我将向您展示它们的异同以及一些优点和缺点。除了理论基础之外,我还向您展示了如何使用 在 Python 中实现每种方法。tensorflow

三、递归神经网络 (RNN)

        通过反馈循环,一个RNN单元的输出也用作同一单元的输入。因此,每个单元格有两个输入:过去和现在。使用过去的信息会导致短期记忆。

        为了更好地理解,我们展开/展开RNN细胞的反馈回路。展开单元格的长度等于输入序列的时间步长数。

展开的递归神经网络。

        我们可以看到过去的观察结果是如何作为隐藏状态通过展开的网络传递的。在每个单元格中,当前时间步长x(现值)、前一时间步的隐藏状态h(过去值)和偏差的输入被组合在一起,然后通过激活函数进行限制,以确定当前时间步的隐藏状态。

        在这里,粗体小字母表示向量,而大写粗体字母表示矩阵。

        RNN 的权重 W 通过反向时间传播 (BPTT) 算法进行更新。

        RNN 可用于一对一、一对多、多对一和多对多预测。

3.1 RNN 的优势

        由于其短期记忆,RNN可以处理顺序数据并识别历史数据中的模式。此外,RNN能够处理不同长度的输入。

3.2 RNN的缺点

        RNN遭受消失梯度下降的影响。在这种情况下,用于在反向传播期间更新权重的梯度变得非常小。将权重与接近零的梯度相乘会阻止网络学习新的权重。这种学习的停止导致RNN忘记了在较长的序列中看到的内容。梯度下降消失的问题随着网络的层数增加。

        由于RNN只保留最近的信息,因此模型在考虑遥远过去的观察结果方面存在问题。因此,RNN倾向于在长序列上丢失信息,因为它只存储最新的信息。因此,RNN只有短期记忆,而不是长期记忆。

        此外,由于RNN及时使用反向传播来更新权重,网络也受到梯度爆炸的影响,如果使用ReLu激活函数,则会出现死ReLu单元。前者可能导致收敛问题,而后者可能会停止学习。

3.3 RNN在张量流中的实现

        我们可以使用 .为此,我们使用允许我们堆叠 RNN 层的模型,即层类和层类。tensorflowSequentialSimpleRNNDense

from tensorflow.keras import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
from tensorflow.keras.optimizers import Adam

        只要我们想使用默认参数,就不需要导入优化器。但是,如果我们想自定义优化器的任何参数,我们还需要导入优化器。

        为了构建网络,我们定义一个模型,然后使用该方法添加RNN层。为了添加 RNN 层,我们使用类和传递参数,例如单元数、辍学率或激活函数。对于第一层,我们还可以传递输入序列的形状。Sequentialadd()SimpleRNN

        如果我们堆叠RNN层,我们需要将前一层的参数设置为。这可确保层的输出具有下一个 RNN 层的正确格式。return_sequenceTrue

        为了生成输出,我们使用一个层作为我们的最后一层,传递输出的数量。Dense

# define parameters
n_timesteps, n_features, n_outputs = X_train.shape[1], X_train.shape[2], y_train.shape[1]

# define model
rnn_model = Sequential()
rnn_model.add(SimpleRNN(130, dropout=0.2, return_sequences=True, input_shape=(n_timesteps, n_features)))
rnn_model.add(SimpleRNN(110, dropout=0.2, activation="tanh", return_sequences=True))
rnn_model.add(SimpleRNN(130, dropout=0.2, activation="tanh", return_sequences=True))
rnn_model.add(SimpleRNN(100, dropout=0.2, activation="sigmoid", return_sequences=True))
rnn_model.add(SimpleRNN(40, dropout=0.3, activation="tanh"))
rnn_model.add(Dense(n_outputs))

        定义 RNN 后,我们可以使用该方法编译模型。在这里,我们传递损失函数和我们要使用的优化器。 提供一些内置的损失函数和优化器。compile()tensorflow

rnn_model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=0.001))

在训练 RNN 之前,我们可以使用该方法查看模型和参数数量。这可以让我们了解模型的复杂性。summary()

我们使用该方法训练模型。在这里,我们需要传递训练数据和不同的参数来自定义训练,包括 epoch 数、批量大小、验证拆分和提前停止。fit()

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
rnn_model.fit(X_train, y_train, epochs=30, batch_size=32, validation_split=0.2, callbacks=[stop_early])

        要对我们的测试数据集或任何看不见的数据进行预测,我们可以使用该方法。该参数仅说明我们是否要获取有关预测过程状态的任何信息。在这种情况下,我不希望打印出任何状态。predict()verbose

y_pred = rnn_model.predict(X_test, verbose=0)

张量流中 RNN 的超参数调优

        正如我们所看到的,RNN的实现非常简单。然而,找到正确的超参数,例如每层的单元数、辍学率或激活函数,要困难得多。

        但是,我们可以使用库,而不是手动更改超参数。该库有四个调谐器、、 和 ,用于从给定的搜索空间中识别正确的超参数组合。keras-tunerRandomSearchHyperbandBayesianOptimizationSklearn

        要运行调谐器,我们首先需要导入和 Keras 调谐器。tensorflow

import tensorflow as tf
import keras_tuner as kt

然后,我们构建超调谐模型,在其中定义超参数搜索空间。我们可以使用一个函数构建超模型,在该函数中,我们以与上述相同的方式构建模型。唯一的区别是我们为要调整的每个超参数添加搜索空间。在下面的示例中,我想调整每个 RNN 层的单元数、激活函数和辍学率。

def build_RNN_model(hp):
    
    # define parameters
    n_timesteps, n_features, n_outputs = X_train.shape[1], X_train.shape[2], y_train.shape[1]

    # define model
    model = Sequential()

    model.add(SimpleRNN(hp.Int('input_unit',min_value=50,max_value=150,step=20), return_sequences=True, dropout=hp.Float('in_dropout',min_value=0,max_value=.5,step=0.1), input_shape=(n_timesteps, n_features)))
    model.add(SimpleRNN(hp.Int('layer 1',min_value=50,max_value=150,step=20), activation=hp.Choice("l1_activation", values=["tanh", "relu", "sigmoid"]), dropout=hp.Float('l1_dropout',min_value=0,max_value=.5,step=0.1), return_sequences=True))
    model.add(SimpleRNN(hp.Int('layer 2',min_value=50,max_value=150,step=20), activation=hp.Choice("l2_activation", values=["tanh", "relu", "sigmoid"]), dropout=hp.Float('l2_dropout',min_value=0,max_value=.5,step=0.1), return_sequences=True))
    model.add(SimpleRNN(hp.Int('layer 3',min_value=20,max_value=150,step=20), activation=hp.Choice("l3_activation", values=["tanh", "relu", "sigmoid"]), dropout=hp.Float('l3_dropout',min_value=0,max_value=.5,step=0.1), return_sequences=True))
    model.add(SimpleRNN(hp.Int('layer 4',min_value=20,max_value=150,step=20), activation=hp.Choice("l4_activation", values=["tanh", "relu", "sigmoid"]), dropout=hp.Float('l4_dropout',min_value=0,max_value=.5,step=0.1)))

    # output layer
    model.add(Dense(n_outputs))

    model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=1e-3))

    return model

        要定义每个变量的搜索空间,我们可以使用不同的方法,例如、 和 。前两者的用法非常相似。我们给它们一个名称、一个最小值、一个最大值和一个步长。该名称用于标识超参数,而最小值和最大值定义我们的值范围。步长参数定义了我们用于调优的范围内的值。可用于调整分类超参数,例如激活函数。在这里,我们只需要传递要测试的选项列表。hp.Inthp.Floathp.Choicehp.Choice

        构建超模型后,我们需要实例化调谐器并执行超调谐。尽管我们可以在不同的调优算法之间进行选择,但它们的实例化非常相似。我们通常需要指定要优化的目标和要训练的最大 epoch 数。在这里,建议将 epochs 设置为略高于我们预期的 epoch 数的数字,然后使用提前停止。

        例如,如果我们想使用调谐器和验证损失作为目标,我们可以将调谐器构建为Hyperband

tuner = kt.Hyperband(build_RNN_model,
                     objective="val_loss",
                     max_epochs=100,
                     factor=3,
                     hyperband_iterations=5,
                     directory='kt_dir',
                     project_name='rnn',
                     overwrite=True)

        在这里,我还传递了存储结果的目录,以及调谐器迭代完整超带算法的频率。

        实例化调谐器后,我们可以使用该方法执行超参数调优。search()

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
tuner.search(X_train, y_train, validation_split=0.2, callbacks=[stop_early])

为了提取最佳超参数,我们可以使用该方法并使用我们调整的每个超参数的方法和名称。get_best_hyperparameters()get()

best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"input: {best_hps.get('input_unit')}")
print(f"input dropout: {best_hps.get('in_dropout')}")
(未完待续)

四、长期短期记忆 (LSTM)

LSTM是一种特殊类型的RNN,它解决了简单RNN的主要问题,即梯度消失的问题,即过去进一步的信息丢失。

展开的长短期记忆细胞。

LSTM 的关键是单元状态,它从单元的输入传递到输出。因此,细胞状态允许信息沿着整个链流动,只需通过三个门的微小线性动作。因此,细胞状态代表 LSTM 的长期记忆。这三个门称为遗忘门、输入门和输出门。这些门用作过滤器并控制信息流,并确定保留或忽略哪些信息。

遗忘门决定保留多少长期记忆。为此,使用了一个sigmoid函数来说明细胞状态的重要性。输出在 0 到 1 之间变化,并说明保留了多少信息,即 0,不保留任何信息,1,保留单元格状态的所有信息。输出由当前输入x、前一个时间步的隐藏状态h和偏置b组合确定。

输入门决定将哪些信息添加到细胞状态中,从而添加到长期记忆中。在这里,sigmoid 层决定更新哪些值。

输出决定单元状态的哪些部分构建输出。因此,输出门负责短期记忆。

可以看出,所有三个门都由相同的功能表示。只有权重和偏差不同。单元格状态通过遗忘门和输入门更新。

上述等式中的第一个项决定了保留了多少长期记忆,而第二项则向细胞状态添加新信息。

然后,当前时间步长的隐藏状态由输出门和将单元状态限制在 -1 和 1 之间的 tanh 函数确定。

4.1 LSTM的优势

LSTM的优点与RNN相似,主要优点是它们可以捕获序列的长期和短期模式。因此,它们是最常用的RNN。

4.2 LSTM的缺点

由于其更复杂的结构,LSTM 的计算成本更高,导致训练时间更长。

由于 LSTM 还使用时间反向传播算法来更新权重,因此 LSTM 存在反向传播的缺点(例如,死 ReLu 元素、梯度爆炸)。

4.3 LSTM在张量流中的实现

        LSTM的实现与简单的RNN非常相似。唯一的区别是我们导入类而不是类。tensorflowLSTMSimpleRNN

from tensorflow.keras import Sequential
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.optimizers import Adam

我们可以像简单的RNN一样将LSTM网络组合在一起。

# define parameters
n_timesteps, n_features, n_outputs = X_train.shape[1], X_train.shape[2], y_train.shape[1]

# define model
lstm_model = Sequential()
lstm_model.add(LSTM(130, return_sequences=True, dropout=0.2, input_shape=(n_timesteps, n_features)))
lstm_model.add(LSTM(70, activation="relu", dropout=0.1, return_sequences=True))
lstm_model.add(LSTM(100, activation="tanh", dropout=0))

# output layer
lstm_model.add(Dense(n_outputs, activation="tanh"))

lstm_model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=0.001))

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
lstm_model.fit(X_train, y_train, epochs=30, batch_size=32, validation_split=0.2, callbacks=[stop_early])

        超参数调整也与简单 RNN 相同。因此,我们只需要对我上面显示的代码片段进行微小的更改。

五、门控循环单元 (GRU)

        与LSTM类似,GRU解决了简单RNN的梯度消失问题。然而,与LSTM的区别在于GRU使用较少的门,并且没有单独的内部存储器,即单元状态。因此,GRU 仅依靠隐藏状态作为内存,从而简化架构。

展开的门控循环单元 (GRU)。

        复位门负责短期记忆,因为它决定保留和忽略多少过去的信息。

        向量 r 中的值由 sigmoid 函数限定在 0 和 1 之间,并取决于前一个时间步长的隐藏状态 h 和当前输入 x。两者都使用权重矩阵 W 进行加权。此外,还添加了偏差 b

        相比之下,更新门负责长期记忆,可与LSTM的遗忘相媲美。

        正如我们所看到的,重置门和更新门之间的唯一区别是权重 W

        当前时间步的隐藏状态是根据两步过程确定的。首先,确定候选隐藏状态。候选状态是当前输入和前一个时间步的隐藏状态以及激活函数的组合。在此示例中,使用 tanh 函数。先前隐藏状态对候选隐藏状态的影响由复位门控制

        在第二步中,将候选隐藏状态与前一个时间步的隐藏状态相结合,以生成当前隐藏状态。以前的隐藏状态和候选隐藏状态的组合方式由更新入口确定。

        如果更新门给出的值为 0,则完全忽略以前的隐藏状态,当前隐藏状态等于候选隐藏状态。如果更新门给出的值为 <>,反之亦然。

5.1 GRU 的优势

        由于与 LSTM 相比架构更简单(即两个而不是三个门和一个状态而不是两个),GRU 在计算上更有效率,训练速度更快,因为它们需要更少的内存。

        此外,GRU已被证明对较小的序列更有效。

5.2 GRU 的缺点

        由于GRU没有单独的隐藏和细胞状态,它们可能无法像LSTM那样考虑过去的观测结果。

        与RNN和LSTM类似,GRU也可能遭受反向传播的缺点,及时更新权重,即死ReLu元素,爆炸梯度。

5.3 GRU在张量流中的实现

        至于LSTM,GRU的实现与简单的RNN非常相似。我们只需要导入类,而其余部分保持不变。GRU

from tensorflow.keras import Sequential
from tensorflow.keras.layers import GRU, Dense
from tensorflow.keras.optimizers import Adam

# define parameters
n_timesteps, n_features, n_outputs = X_train.shape[1], X_train.shape[2], y_train.shape[1]

# define model
gru_model = Sequential()
gru_model.add(GRU(90,return_sequences=True, dropout=0.2, input_shape=(n_timesteps, n_features)))
gru_model.add(GRU(150, activation="tanh", dropout=0.2, return_sequences=True))
gru_model.add(GRU(60, activation="relu", dropout=0.5))
gru_model.add(Dense(n_outputs))

gru_model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=0.001))

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
gru_model.fit(X_train, y_train, epochs=30, batch_size=32, validation_split=0.2, callbacks=[stop_early])

这同样适用于超参数优化。

六、结论

        递归神经网络将记忆引入神经网络。这样,观测值在顺序和时间序列数据中的依赖性就包含在我们的预测中。

        在本文中,我向您展示了三种类型的递归神经网络,即简单RNN,LSTM和GRU。我已经向您展示了它们是如何工作的,它们的优点和缺点是什么,以及如何使用 在 Python 中实现它们。tensorflow

        请让我知道您对这篇文章的看法!

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

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

相关文章

软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?

在当今互联网时代&#xff0c;软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么&#xff0c;这个测试的目的和意义是什么呢?另外&#xff0c;信息化建设验收测试依据又是什么呢?    一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…

低成本无刷高速吹风机单片机方案

高速吹风机的转速一般是普通吹风机的5倍左右。一般来说&#xff0c;吹风机的电机转速一般为2-3万转/分钟&#xff0c;而高速吹风机的电机转速一般为10万转/分钟左右。高转速增加了高风速。一般来说&#xff0c;吹风机的风力只有12-17米/秒&#xff0c;而高速吹风机的风力可以达…

信号浪涌保护器的综合应用方案

信号浪涌保护器是一种用于保护电子设备免受信号线路上的瞬态过电压和浪涌电流的影响的装置。信号浪涌保护器的原理是利用气体放电管、压敏电阻、齐纳二极管等元件&#xff0c;将信号线路上的过高电压限制在一定范围内&#xff0c;或将浪涌电流分流到地线上&#xff0c;从而减少…

gradio解决上传文件数最大为1000的限制

当使用上传文件夹功能传输超过1000个文件时&#xff0c;会报出以下错误&#xff1a; 在github上&#xff0c;最新版的gradio仓库已经解决了这一问题&#xff1a; 但是这一更改还没有正式发布&#xff0c;因此无法使用pip更新&#xff1a; 因此只能先手动git clone https://g…

webstorm debug调试vue项目

1.运行npm&#xff0c;然后控制台会打印下图中的地址&#xff0c;复制local的地址 2.run–>Edit Configuration&#xff0c;如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行&#xff0c;点击debug运行的图标运行即可

vue新学习 05vue的创建运行原理(vue的生命周期)

01.vue的创建过程 原理解释&#xff1a; 1.定义&#xff1a; 1.Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段&#xff0c;Vue在关键时刻帮我们调用的一些特殊名称的函数。 2.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求…

星戈瑞NH2-PEG-ICG应用纳米荧光成像

欢迎来到星戈瑞荧光stargraydye! NH2-PEG-ICG是一种具有胺基的聚乙二醇修饰的吲哚菁绿染料&#xff0c;常用于纳米荧光成像应用。以下是NH2-PEG-ICG在纳米荧光成像应用中的一些特点和优势&#xff1a; **1. 荧光性能&#xff1a;**NH2-PEG-ICG在近红外光谱区域&#xff08;约7…

电商数据API接口有什么作用和意义,让我们来了解一下吧!

在现代互联网时代&#xff0c;电子商务已经成为了经济发展的重要推动力之一。越来越多的企业和个人开始通过电商平台进行商品销售&#xff0c;而准确的数据分析和及时的数据更新成为了他们的关键需求。而电商数据API接口&#xff0c;作为电商平台和第三方开发者之间的桥梁&…

星河双子塔对面万科星火城市更新规划出炉

龙岗区坂田街道欧威尔空调厂城市更新单元“工业上楼”项目规划&#xff08;草案&#xff09;已经龙岗区“工业上楼”项目工作专班2023年第四次审批会议审议通过。根据《中华人民共和国城乡规划法》《深圳经济特区城市更新条例》《深圳市城市更新办法实施细则》《深圳市“工业上…

手动创建一个DOCKER镜像

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…

600V EasyPIM™ IGBT模块FB30R06W1E3、FB20R06W1E3B11、FB20R06W1E3降低了系统成本和损耗,可满足高能效要求。

EasyPIM™ IGBT模块是一种三相输入整流器PIM IGBT模块&#xff0c;采用TRENCHSTOP™ IGBT7、发射器控制7二极管和NTC/PressFIT技术。该模块具有增强的dv/dt可控性、改进的FWD软度、优化的开关损耗以及8μs短路稳定性。EasyPIM&#xff08;功率集成模块&#xff09;外形非常小巧…

python工具库有哪些,python工具包怎么用

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python工具包有哪些&#xff0c;python工具包怎么用&#xff0c;现在让我们一起来看看吧&#xff01; 最近有多位读者留言&#xff0c;咨询更便捷、高效的python编程开发工具&#xff08;IDE&#xff09;&#xff0c;本…

词性标记:隐马尔可夫模型简介(1/2)

一、说明 作为人类&#xff0c;我们比这个星球上的任何动物都更了解自然语言的许多细微差别。比如说&#xff1a;“你吃了吗”&#xff0c;“企业吃不饱”&#xff0c;“吃豆腐”&#xff0c;“吃醋了”&#xff1b;同样一个“吃”&#xff0c;意义不同&#xff0c;从一个符号出…

tsmc12 加tap cell/boundary cell失败原因总结

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口 via0_grid tsmc12有via0的概念,boundary cell不需要对齐via0,但tap cell的pg pin是有via0这一层的,所以当tap cell添加失败,首先需要检查的就是via0_grid是否创建成功,offset能否对齐via0。 …

【低代码预研】通过低代码平台开发应用程序

目录 低代码介绍 预研目标 预研产品 1. 业务流程 2. 用户权限 3. 统计图表 4. 大屏设计 5. 第三方登录 6. 分布式调度 小结 近几年&#xff0c;一直对低代码平台有所耳闻&#xff0c;目前已经对低代码平台有了一定的认识&#xff0c;如果能通过一个可视化的配置页面就能完成前端…

今天我会带你了解音频转文字怎么弄的

常常被老板的“长”会议限制住了怎么办&#xff1f;当然这里的“长”是指时长。 老板的唠叨话不是一两个小时能讲完的&#xff0c;而且还需要你将会议心得整理给他&#xff0c;你可以受得吗&#xff1f; 我经常遇到这种情况&#xff0c;都习以为常了&#xff0c;因为我找到应…

Microsoft SQL Server 2008中,语法生成错误“并行数据仓库(PDW)功能未启用“(已解决)

案例&#xff1a; 原表有两列&#xff0c;分别为月份、月份销售额&#xff0c;而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和 sql 测试数据准备&#xff1a; DECLARE Temp Table ( monthNo INT, --- 月份 MoneyData Float --- 金额 ) insert INTO TEM…

PintOS lab2 User Programs 实验记录

Background 大体流程如下图所示&#xff0c;显然这时候start_process无法被调度到。 然后start_process 里面load .out文件 &#xff08;.o文件就是对象文件,是可重定向文件的一种,通常以ELF格式保存&#xff0c;里面包含了对各个函数的入口标记&#xff0c;描述&#xff0c;…

VLAN监控及常见问题排查

局域网&#xff0c;我们通常称为LAN&#xff0c;是一种由基于同一地理位置的设备组成的网络&#xff0c;可实现它们之间的通信&#xff0c;局域网的虚拟对应物是虚拟局域网或 VLAN。VLAN 增强了 LAN&#xff0c;提供了进行更改的灵活性、更高的可扩展性和更好的安全性。 使用 …

LLM中的微调演变

目录 微调演变InstructGPT的训练 微调演变 首先是任务驱动了微调的发展&#xff0c;GPT1和BERT遵循经典的预训练微调范式&#xff0c;到GPT3时期&#xff0c;预训练任务表现为句子接龙&#xff0c;给定前文持续预测下一个word&#xff0c;当模型参数规模和训练数据增大后&…