fast.ai 深度学习笔记(二)(2)

简介: fast.ai 深度学习笔记(二)

fast.ai 深度学习笔记(二)(1)https://developer.aliyun.com/article/1482681

幕后的矩阵代数[01:04:47]

通过索引查找嵌入与对一个独热编码向量和嵌入矩阵进行矩阵乘积是相同的。但这样做效率非常低,所以现代库将其实现为取一个整数并查找数组中的值。

问题:您能谈谈如何将日期和时间作为分类变量以及这如何影响季节性吗?[01:06:59] 有一个 Fast.ai 函数叫做add_datepart,它接受一个数据框和一个列名。它可以选择从数据框中删除该列,并用许多列代替,表示有关该日期的所有有用信息,如星期几、月份、年份等(基本上是 Pandas 给我们的所有信息)。

add_datepart(weather, "Date", drop=False)
add_datepart(googletrend, "Date", drop=False)
add_datepart(train, "Date", drop=False)
add_datepart(test, "Date", drop=False)

例如,现在星期几变成了一个八行四列的嵌入矩阵。从概念上讲,这使我们的模型能够创建一些有趣的时间序列模型。如果有一些东西有一个七天周期循环,星期一上升,星期三下降,但仅限于每天且仅在柏林,它完全可以做到 - 它拥有所有需要的信息。这是处理时间序列的一种奇妙方式。您只需要确保时间序列中的周期指示器存在为一列。如果没有一个名为星期几的列,神经网络学习进行模七和查找嵌入矩阵将非常困难。这并非不可能,但确实很难。如果您正在预测旧金山饮料的销售情况,您可能想要一个 AT&T 球场的球赛时间表,因为这将影响到 SoMa 地区喝啤酒的人数。因此,您需要确保基本指标或周期性存在于您的数据中,只要它们存在,神经网络就会学会使用它们。

学习者[01:10:13]

m = md.get_learner(
    emb_szs, 
    len(df.columns)-len(cat_vars), 
    0.04, 1,
    [1000,500], 
    [0.001,0.01], 
    y_range=y_range
)
lr = 1e-3
  • emb_szs:嵌入大小
  • len(df.columns)-len(cat_vars):数据框中连续变量的数量
  • 0.04:嵌入矩阵有自己的丢失率,这是丢失率
  • 1:我们想要创建多少输出(最后一个线性层的输出)
  • [1000, 500]:第一个线性层和第二个线性层中的激活数量
  • [0.001, 0.01]:第一个线性层和第二个线性层中的丢失率
  • y_range:现在我们不会担心这个
m.fit(lr, 3, metrics=[exp_rmspe])
'''
A Jupyter Widget
[ 0\.       0.02479  0.02205* *0.19309**]                          
[ 1\.       0.02044  0.01751* *0.18301**]                          
[ 2\.       0.01598  0.01571* *0.17248**]*
  • metrics:这是一个自定义指标,指定在每个时期结束时调用的函数并打印结果
m.fit(lr, 1, metrics=[exp_rmspe], cycle_len=1)
'''
[ 0\.       0.00676  0.01041  0.09711]* 

通过使用所有的训练数据,我们实现了大约 0.09711 的 RMSPE。公共排行榜和私人排行榜之间存在很大差异,但我们肯定处于比赛的前端。

因此,这是一种处理时间序列和结构化数据的技术。有趣的是,与使用这种技术的组相比(分类变量的实体嵌入),第二名的获胜者进行了更多的特征工程。这个比赛的获胜者实际上是物流销售预测方面的专家,因此他们有自己的代码来创建大量的特征。Pinterest 的人们为推荐构建了一个非常相似的模型,他们也说当他们从梯度提升机转向深度学习时,他们做了更少的特征工程,这是一个更简单的模型,需要更少的维护。因此,使用这种深度学习方法的一个重要好处是,您可以获得最先进的结果,但工作量要少得多。

问题:我们在这些中使用任何时间序列吗?间接地,是的。正如我们刚才看到的,我们的列中有一周的天数,一年的月份等,大多数被视为类别,因此我们正在构建一种分布式表示,例如一月,星期日等。我们没有使用任何经典的时间序列技术,我们所做的只是在神经网络中进行真正的全连接层。嵌入矩阵能够以比任何标准时间序列技术更丰富的方式处理一周中的周期性。

关于图像模型和这个模型之间的区别的问题:在调用get_learner的方式上有所不同。在图像处理中,我们只是做了Learner.trained并传递数据:

learn = ConvLearner.pretrained(arch, data, ps=0., precompute=True)

对于这些类型的模型,实际上对于很多模型,我们构建的模型取决于数据。在这种情况下,我们需要知道我们有哪些嵌入矩阵。因此,在这种情况下,数据对象创建了学习者(与我们之前看到的相反):

m = md.get_learner(
    emb_szs, 
    len(df.columns)-len(cat_vars), 
    0.04, 1,
    [1000,500], 
    [0.001,0.01], 
    y_range=y_range
)

步骤总结(如果你想为自己的数据集使用这个):

步骤 1。列出分类变量名称和连续变量名称,并将它们放入 Pandas 数据框中

步骤 2。创建一个列表,其中包含您想要在验证集中的行索引

步骤 3。调用这行代码:

md = ColumnarModelData.from_data_frame(
    PATH, val_idx, df, 
    yl.astype(np.float32), 
    cat_flds=cat_vars, 
    bs=128, 
    test_df=df_test
)

步骤 4。创建一个您想要每个嵌入矩阵有多大的列表

步骤 5。调用get_learner — 您可以使用这些确切的参数开始:

m = md.get_learner(
    emb_szs, 
    len(df.columns)-len(cat_vars), 
    0.04, 1,
    [1000,500], 
    [0.001,0.01], 
    y_range=y_range
)

步骤 6。调用m.fit

问题:如何为这种类型的数据使用数据增强,以及辍学是如何工作的?没有头绪。Jeremy 认为这必须是特定于领域的,但他从未见过任何论文或任何行业人士在结构化数据和深度学习中使用数据增强。他认为这是可以做到的,但还没有看到有人这样做。辍学所做的事情与以前完全相同。

问题:有什么缺点?几乎没有人在使用这个。为什么?基本上答案就像我们之前讨论的那样,几乎没有人在学术界从事这方面的工作,因为这不是人们发表论文的内容。因此,人们没有真正出色的例子可以参考,说“哦,这是一个很好的技术,让我们让我们的公司实施它”。但也许同样重要的是,直到现在有了这个 Fast.ai 库,没有任何方便的方法来做到这一点。如果你想要实现其中一个模型,你必须自己编写所有的自定义代码。有很多商业和科学机会可以利用这一点,并解决以前没有很好解决的问题。

自然语言处理

深度学习中最具潜力的领域是自然语言处理,它比计算机视觉落后了两三年。软件状态和一些概念的成熟程度远不及计算机视觉。在自然语言处理中,你会发现有一些特定的问题可以解决,它们有特定的名称。在自然语言处理中有一种特定的问题叫做“语言建模”,它有一个非常具体的定义——构建一个模型,在给定一个句子的几个单词后,你能否预测下一个单词是什么。

语言建模

笔记本

这里我们有来自 arXiv(arXiv.org)的 18 个月的论文,这是一个例子:

' '.join(md.trn_ds[0].text[:150])
'''
'<cat> csni <summ> the exploitation of mm - wave bands is one of the key - enabler for 5 g mobile \n radio networks . however , the introduction of mm - wave technologies in cellular \n networks is not straightforward due to harsh propagation conditions that limit \n the mm - wave access availability . mm - wave technologies require high - gain antenna \n systems to compensate for high path loss and limited power . as a consequence , \n directional transmissions must be used for cell discovery and synchronization \n processes : this can lead to a non - negligible access delay caused by the \n exploration of the cell area with multiple transmissions along different \n directions . \n    the integration of mm - wave technologies and conventional wireless access \n networks with the objective of speeding up the cell search process requires new \n'
'''
  • — 论文的类别。CSNI 是计算机科学和网络
  • — 论文的摘要

这是训练语言模型的输出看起来像什么。我们进行了一些简单的测试,输入一些初始文本,看模型认为接下来应该是什么:

sample_model(m, "<CAT> csni <SUMM> algorithms that")
'''
...use the same network as a single node are not able to achieve the same performance as the traditional network - based routing algorithms . in this paper , we propose a novel routing scheme for routing protocols in wireless networks . the proposed scheme is based ...
'''

它通过阅读 arXiv 论文学到,写关于计算机网络的人会这样说话。记住,它最初完全不懂英语。它最初为英语中的每个单词都有一个随机的嵌入矩阵。通过阅读大量的 arXiv 论文,它学会了哪些单词跟随其他单词。

这里我们尝试指定一个类别为计算机视觉:

sample_model(m, "<CAT> cscv <SUMM> algorithms that")
'''
...use the same data to perform image classification are increasingly being used to improve the performance of image classification algorithms . in this paper , we propose a novel method for image classification using a deep convolutional neural network ( cnn ) . the proposed method is ...
'''

它不仅学会了写英语,而且在你说完“卷积神经网络”之后,你应该使用括号来指定一个缩写“(CNN)”。

sample_model(m,"<CAT> cscv <SUMM> algorithms. <TITLE> on ")
'''
...the performance of deep learning for image classification <eos>*sample_model(m,"<CAT> csni <SUMM> algorithms. <TITLE> on ")*...the performance of wireless networks <eos>*sample_model(m,"<CAT> cscv <SUMM> algorithms. <TITLE> towards ")*...a new approach to image classification <eos>*sample_model(m,"<CAT> csni <SUMM> algorithms. <TITLE> towards ")*...a new approach to the analysis of wireless networks <eos>
'''

语言模型可以非常深奥,因此我们将尝试构建它——不是因为我们真的在乎这个,而是因为我们试图创建一个用于执行其他任务的预训练模型。例如,给定一个 IMDB 电影评论,我们将确定它们是积极的还是消极的。这很像猫和狗——一个分类问题。因此,我们真的希望使用一个至少知道如何阅读英语的预训练网络。因此,我们将训练一个模型来预测句子的下一个单词(即语言模型),就像在计算机视觉中一样,在最后添加一些新层,并要求它预测某物是积极的还是消极的。

IMDB

笔记本

我们要做的是训练一个语言模型,使其成为分类模型的预训练模型。换句话说,我们试图利用我们在计算机视觉中学到的微调技巧来创建强大的分类模型。

问题:为什么直接做你想做的事情不起作用?事实证明它并不起作用。有几个原因。首先,我们知道微调预训练网络非常强大。因此,如果我们可以让它先学习一些相关任务,然后我们可以利用所有这些信息来尝试帮助它完成第二个任务。另一个原因是 IMDB 电影评论长达数千字。因此,在阅读数千字后,不了解英语结构或单词或标点符号的情况下,你只会得到一个 1 或 0(积极或消极)。试图学习整个英语结构,然后从一个数字中了解它如何表达积极和消极情绪,这是期望太高了。

问题:这与 Karpathy 的 Char-RNN 相似吗?这与 Char-RNN 有些相似,它可以根据前几个字母预测下一个字母。语言模型通常在单词级别上工作(但不一定),我们将在本课程中专注于单词级别的建模。

问题:这些生成的单词/句子在多大程度上是实际复制了在训练集中找到的内容?单词肯定是之前见过的单词,因为它不是字符级别的,所以它只能给我们之前见过的单词。句子,有严格的方法来做,但最简单的方法是看上面的例子,你会对此有所了解。最重要的是,当我们训练语言模型时,我们将有一个验证集,以便我们尝试预测以前从未见过的东西的下一个单词。有一些技巧可以使用语言模型来生成文本,比如 beam search。

文本分类的用例:

  • 对于对冲基金,识别过去导致市场大幅下跌的文章或 Twitter 中的内容。
  • 识别客户服务查询,这些查询往往与下个月取消合同的人相关联
  • 将文档组织成是否属于法律发现的一部分。
from fastai.learner import *
import torchtext
from torchtext import vocab, data
from torchtext.datasets import language_modeling
from fastai.rnn_reg import *
from fastai.rnn_train import *
from fastai.nlp import *
from fastai.lm_rnn import *
import dill as pickle
  • torchtext — PyTorch 的 NLP 库

数据

IMDB 大型电影评论数据集

PATH = 'data/aclImdb/'
TRN_PATH = 'train/all/'
VAL_PATH = 'test/all/'
TRN = f'{PATH}{TRN_PATH}'
VAL = f'{PATH}{VAL_PATH}'
%ls {PATH}
'''
imdbEr.txt  imdb.vocab  models/  README  test/  tmp/  train/
'''

在这种情况下,我们没有单独的测试和验证。就像在视觉中一样,训练目录中有一堆文件:

trn_files = !ls {TRN}
trn_files[:10]
'''
['0_0.txt',
 '0_3.txt',
 '0_9.txt',
 '10000_0.txt',
 '10000_4.txt',
 '10000_8.txt',
 '1000_0.txt',
 '10001_0.txt',
 '10001_10.txt',
 '10001_4.txt']
'''
review = !cat {TRN}{trn_files[6]}
review[0]
'''
"I have to say when a name like Zombiegeddon and an atom bomb on the front cover I was expecting a flat out chop-socky fung-ku, but what I got instead was a comedy. So, it wasn't quite was I was expecting, but I really liked it anyway! The best scene ever was the main cop dude pulling those kids over and pulling a Bad Lieutenant on them!! I was laughing my ass off. I mean, the cops were just so bad! And when I say bad, I mean The Shield Vic Macky bad. But unlike that show I was laughing when they shot people and smoked dope.<br /><br />Felissa Rose...man, oh man. What can you say about that hottie. She was great and put those other actresses to shame. She should work more often!!!!! I also really liked the fight scene outside of the building. That was done really well. Lots of fighting and people getting their heads banged up. FUN! Last, but not least Joe Estevez and William Smith were great as the...well, I wasn't sure what they were, but they seemed to be having fun and throwing out lines. I mean, some of it didn't make sense with the rest of the flick, but who cares when you're laughing so hard! All in all the film wasn't the greatest thing since sliced bread, but I wasn't expecting that. It was a Troma flick so I figured it would totally suck. It's nice when something surprises you but not totally sucking.<br /><br />Rent it if you want to get stoned on a Friday night and laugh with your buddies. Don't rent it if you are an uptight weenie or want a zombie movie with lots of flesh eating.<br /><br />P.S. Uwe Boil was a nice touch."
'''

现在我们将检查数据集中有多少单词:

!find {TRN} -name '*.txt' | xargs cat | wc -w
'''
17486581
'''
!find {VAL} -name '*.txt' | xargs cat | wc -w
'''
5686719
'''

在我们可以对文本进行任何操作之前,我们必须将其转换为标记列表。标记基本上就像一个单词。最终我们将把它们转换成一系列数字,但第一步是将其转换成一系列单词——这在 NLP 中称为“标记化”。一个好的标记器将很好地识别句子中的片段。每个分隔的标点符号将被分开,每个多部分单词的部分将被适当地分开。Spacy 做了很多 NLP 工作,Jeremy 知道它有最好的标记器。因此,Fast.ai 库被设计为与 Spacey 标记器以及 torchtext 一起很好地工作。

创建一个字段

字段是如何预处理一些文本的定义。

TEXT = data.Field(lower=True, tokenize=spacy_tok)
  • lower=True — 将文本转换为小写
  • tokenize=spacy_tok — 使用spacy_tok进行标记化

现在我们创建通常的 Fast.ai 模型数据对象:

bs=64; bptt=70
FILES = dict(train=TRN_PATH, validation=VAL_PATH, test=VAL_PATH)
md = LanguageModelData.from_text_files(
    PATH, TEXT, **FILES, bs=bs, 
    bptt=bptt, min_freq=10
)
  • PATH:通常是数据所在的位置,保存模型等
  • TEXT:torchtext 的 Field 定义
  • **FILES:我们拥有的所有文件的列表:训练、验证和测试(为了保持简单,我们没有单独的验证和测试集,所以两者都指向验证文件夹)
  • bs:批量大小
  • bptt:通过时间反向传播。这意味着我们一次将多长的句子放在 GPU 上
  • min_freq=10:一会儿,我们将用整数(每个单词的唯一索引)替换单词。如果有任何出现次数少于 10 次的单词,就称之为未知。

构建了我们的ModelData对象之后,它会自动填充TEXT对象的一个非常重要的属性:TEXT.vocab。这是一个词汇表,它存储了文本中看到的哪些唯一单词(或标记),以及每个单词将被映射到一个唯一的整数 ID。

# 'itos': 'int-to-string' 
TEXT.vocab.itos[:12]
'''
['<unk>', '<pad>', 'the', ',', '.', 'and', 'a', 'of', 'to', 'is', 'it', 'in']
'''
# 'stoi': 'string to int'
TEXT.vocab.stoi['the']
'''
2
'''

itos按频率排序,除了前两个特殊的。使用vocab,torchtext 将为我们将单词转换为整数 ID:

md.trn_ds[0].text[:12]
'''
['i',
 'have',
 'always',
 'loved',
 'this',
 'story',
 '-',
 'the',
 'hopeful',
 'theme',
 ',',
 'the']
'''
TEXT.numericalize([md.trn_ds[0].text[:12]])
'''
Variable containing:
   12
   35
  227
  480
   13
   76
   17
    2
 7319
  769
    3
    2
[torch.cuda.LongTensor of size 12x1 (GPU 0)]
'''

问题:通常会进行任何词干处理或词形还原吗?不是很常见。一般来说,我们只需要进行分词。为了尽可能通用,我们想知道接下来会发生什么,所以无论是将来时还是过去时,还是复数还是单数,我们并不真的知道哪些事情会有趣,哪些不会,所以似乎最好尽可能保持不变。

问题:处理自然语言时,上下文不重要吗?为什么我们要对单个词进行标记化和查看?[01:46:38] 不,我们不是在查看单个词 - 它们仍然是有序的。只是因为我们用数字 12 替换了 I,它们仍然是按照那个顺序的。处理自然语言的另一种方法叫做“词袋”,它们会丢弃顺序和上下文。在机器学习课程中,我们将学习如何使用词袋表示,但我认为它们已经不再有用或即将不再有用。我们开始学习如何正确使用深度学习来使用上下文。

fast.ai 深度学习笔记(二)(3)https://developer.aliyun.com/article/1482684

相关文章
|
15小时前
|
存储 人工智能 Linux
|
4天前
|
机器学习/深度学习 人工智能 算法
【AI】从零构建深度学习框架实践
【5月更文挑战第16天】 本文介绍了从零构建一个轻量级的深度学习框架tinynn,旨在帮助读者理解深度学习的基本组件和框架设计。构建过程包括设计框架架构、实现基本功能、模型定义、反向传播算法、训练和推理过程以及性能优化。文章详细阐述了网络层、张量、损失函数、优化器等组件的抽象和实现,并给出了一个基于MNIST数据集的分类示例,与TensorFlow进行了简单对比。tinynn的源代码可在GitHub上找到,目前支持多种层、损失函数和优化器,适用于学习和实验新算法。
59 2
|
6天前
|
机器学习/深度学习 人工智能 算法
AI大咖说-关于深度学习的一点思考
周志华教授探讨深度学习的成效,指出其关键在于大量数据、强大算力和训练技巧。深度学习依赖于函数可导性、梯度下降及反向传播算法,尽管硬件和数据集有显著进步,但核心原理保持不变。深度意味着增加模型复杂度,相较于拓宽,加深网络更能增强泛函表达能力,促进表示学习,通过逐层加工处理和内置特征变换实现抽象语义理解。周志华教授还提到了非神经网络的深度学习方法——深度森林。5月更文挑战第12天
30 5
|
6天前
|
机器学习/深度学习 人工智能 算法
构建高效AI系统:深度学习优化技术解析
【5月更文挑战第12天】 随着人工智能技术的飞速发展,深度学习已成为推动创新的核心动力。本文将深入探讨在构建高效AI系统中,如何通过优化算法、调整网络结构及使用新型硬件资源等手段显著提升模型性能。我们将剖析先进的优化策略,如自适应学习率调整、梯度累积技巧以及正则化方法,并讨论其对模型训练稳定性和效率的影响。文中不仅提供理论分析,还结合实例说明如何在实际项目中应用这些优化技术。
|
6天前
|
机器学习/深度学习 敏捷开发 人工智能
吴恩达 x Open AI ChatGPT ——如何写出好的提示词视频核心笔记
吴恩达 x Open AI ChatGPT ——如何写出好的提示词视频核心笔记
32 0
|
6天前
|
机器学习/深度学习 人工智能 算法
【AI 初识】讨论深度学习和机器学习之间的区别
【5月更文挑战第3天】【AI 初识】讨论深度学习和机器学习之间的区别
|
6天前
|
机器学习/深度学习 自然语言处理 PyTorch
fast.ai 深度学习笔记(三)(4)
fast.ai 深度学习笔记(三)(4)
25 0
|
6天前
|
机器学习/深度学习 算法 PyTorch
fast.ai 深度学习笔记(三)(3)
fast.ai 深度学习笔记(三)(3)
34 0
|
6天前
|
机器学习/深度学习 编解码 自然语言处理
fast.ai 深度学习笔记(三)(2)
fast.ai 深度学习笔记(三)(2)
38 0
|
6天前
|
机器学习/深度学习 PyTorch 算法框架/工具
fast.ai 深度学习笔记(三)(1)
fast.ai 深度学习笔记(三)(1)
41 0

热门文章

最新文章