工程实践
石头猿rock
这个作者很懒,什么都没留下…
展开
-
数据不平衡
随机删除一些类别多的数据,但是会改变数据分布,减少信息。目前比较好的方法是将欠采样应用到集成学习中,即对正例进行多次欠采样,将其分成n份,之后配以反例,从而形成多组正例/反例数据集,供多个学习器使用。这样看来,每个学习器都采用了欠采样,但是在全局看来不会丢失重要信息。:把类别少的数据通过复制或生成SMOTH的方法变多,也可用数据增强的方法去做。:数据分布不会发生变化,但是仍然有数据不平衡的问题。原创 2022-10-05 17:07:07 · 220 阅读 · 0 评论 -
工程代码书写规范
数据的处理,包括DataLoader的创建,训练时对输入序列做随机Mask的逻辑。优化器的实现,修正L2的weight_decay方法。定义模型,forward的逻辑,得到训练loss。模型训练任务的组织。原创 2022-07-22 15:38:38 · 571 阅读 · 0 评论 -
readlines,lambda,map,json
readline和readlines在读取文件中的文本时经常用到,readlines返回的是包含每行文本的一个列表,其中每个文本的结尾是\n。json的定义json是指javascript对象表示法,独立于语言,是轻量级的文本数据交换格式。json.loads()将str类型的数据转换成dict类型。json.dumps()将dict类型的数据转换成str。json.dump()将数据以json的类型写入文件。json.load()从json文件中读取数据。根据提供的函数来做指定的映射。......原创 2022-07-19 22:46:30 · 207 阅读 · 0 评论 -
文本生成中的OOV问题
oov问题是文本生成任务中很常见的现象,oov问题是怎么产生的呢?原创 2022-07-18 22:43:19 · 2377 阅读 · 0 评论 -
标签平滑 label smoothing
深度学习中最常见的问题就是模型的过拟合,我们通过正则化的技术来减少模型过拟合的情况;常用的正则化技术有:dropout,权重衰减,早停机制;除此之外,标签平滑也是一种正则化技术,因为它限制了softmax的最大概率,使得最大概率和其他概率相差不会特别大。举个栗子:标签进入模型中一般都会转化为one-hot编码,假设有个五分类的任务,某个标签会变成[0,0,0,1,0][0,0,0,1,0][0,0,0,1,0],前向传播经过softmax时,五个类别的概率是[0.05,0.15,0.1,0.65,0.0原创 2022-07-05 15:29:08 · 490 阅读 · 0 评论 -
Dataset和DataLoader
我们一般使用for循环来训练神经网络,在每次的迭代过程,从DataLoader中取出batchsize的数据,然后前向传播反向传播一次,更新参数一次在加载batch数据的时候,torch创建一个可迭代的Dataset对象(需要重写__getitem__()和__len__()两个方法),然后与DataLoader一起使用;DataLoader: 构造一个整数索引的采样器来获取Dataset的数据创建Dataset对象:需要重写 getitem 方法和 len 方法。前者通过提供索引返回数据,也就是提供原创 2022-06-28 17:09:07 · 645 阅读 · 0 评论 -
pack_padded_sequence和pad_packed_sequence&&rnn的输出
在使用rnn训练数据时,常会面临数据长度不一致的情况,这时我们需要将各个序列pad到固定长度,方便batch并行训练;但是填充后虽然长度相同,但是会有很多无效的填充值,会浪费计算资源为了使 RNN 可以高效的读取数据进行训练,就需要在 pad 之后再使用 pack_padded_sequence 对数据进行处理;input:pad后的序列(由大到小排好序)需要注意的是,默认条件下,我们必须把输入数据按照序列长度从大到小排列后才能送入 pack_padded_sequence ,否则会报错。这个函数实际上是原创 2022-06-22 09:41:01 · 325 阅读 · 0 评论 -
学习率预热warmup
学习率:权重更新的控制因子训练神经网络的常规策略是初始时使用较大的学习率(好处是能使网络收敛迅速),随着训练的进行,学习率衰减;在训练初期,loss很大,因此计算的梯度也很大,如果设置较大的学习率,模型很容易跳过最优点,后期很难再拉回来;阶段一: 而warmup是在初始时(前几个epoch)使用较小的学习率,然后随着训练的进行,学习率慢慢增加到设定的学习率(linear线性增加,constant方式等);阶段二: 最后学习率从设定数值再衰减;warmup_factor:warmup期间,学习率初始化为原创 2022-06-21 11:51:08 · 885 阅读 · 0 评论 -
BERT中的CLS效果怎么样
首先BERT中的CLS向量是通过自注意力机制将所有token向量加权求和,原论文中这样说:每个序列的第一个标记始终是特殊分类嵌入([CLS])。该特殊标记对应的最终隐藏状态(即, Transformer 的输出)被用作分类任务中该序列的总表示。对于非分类任务,这个最终隐藏状态将被忽略。那么如果是将该序列分类,用CLS接一个全连接是不错的选择;如果要提取sentence embedding,其效果还不如所有token embedding然后池化操作(mean or max),还有一个比较不错的trick,原创 2022-05-21 16:28:40 · 2353 阅读 · 0 评论 -
BERT的某层均值池化或几层叠加再池化
'''bert的池化是将一个句子中所有token在每一维度上取均值或取最大'''def forward(self,input_ids,attention_mask,token_type_ids,pooling_type): out = self.bert(input_ids,attention_mask,token_type_ids,output_hidden_states=True) if pooling_type = 'cls': return (out.last_hidden_state[:原创 2022-05-20 16:58:49 · 1749 阅读 · 0 评论 -
加载预训练模型的两种方式
通过huggingface快速加载import transformersfrom transformers import BertTokenizer,BertModeltokenizer = BertTokenizer.from_pretrained('bert-base-chinese') #只需要huggingface上对应的模型名称model = BertModel.from_pretrained('bert-base-chinese')优点:无脑操作缺点:每次都需要在网站下载模型参数原创 2022-05-14 15:14:53 · 2137 阅读 · 1 评论