CNN for NLP

强烈推荐:http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp

论文:《Convolutional Neural Networks for Sentence Classification》

Tensorflow 实现blog:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow

代码:https://github.com/dennybritz/cnn-text-classification-tf

框架

首先,理解下卷积:
这里写图片描述

片段

  • ReLU,可以实现稀疏。为什么?假设一个神经元的输出是付出,那ReLU后,就是0,上面的也无法向下传递梯度,这个就会保持在0,就稀疏了。而sigmoid这种,在情况不好的时候,还是有机会“翻身”的。

ReLu的使用,使得网络可以自行引入稀疏性。这一做法,等效于无监督学习的预训练。更快的特征学习。

“一句话概括:不用simgoid和tanh作为激活函数,而用ReLU作为激活函数的原因是:加速收敛。
因为sigmoid和tanh都是饱和(saturating)的。何为饱和?个人理解是把这两者的函数曲线和导数曲线plot出来就知道了:他们的导数都是倒过来的碗状,也就是,越接近目标,对应的导数越小。而ReLu的导数对于大于0的部分恒为1。于是ReLU确实可以在BP的时候能够将梯度很好地传到较前面的网络。”
http://blog.youkuaiyun.com/liulina603/article/details/44915905
http://www.cnblogs.com/xinchrome/p/4964930.html
http://www.cnblogs.com/neopenx/p/4453161.html

  • DropOut,理解为ensemble。在训练时有用,在预测时候不需要。每次都会随机选择一部分神经元失效,相当于用了不同的模型去做。防止过拟合。(感觉自己都说服不了–#)

  • adam,并不理解细节,“Adam 算法根据损失函数对每个参数的梯度的一阶矩估计和二阶矩估计动态调整针对于每个参数的学习速率”,就是学习速率不一致?

  • Batch_Size: https://www.zhihu.com/question/32673260,大数据集,全学习太慢不可行。如果极端,每次只训练一个样本,各个梯度不断修正,难以收敛。

更多资料:

2010-2016年被引用次数最多的深度学习论文: http://synchuman.baijia.baidu.com/article/495369
Tensorflow中文文档:http://wiki.jikexueyuan.com/project/tensorflow-zh/
深度学习博客:http://blog.youkuaiyun.com/zouxy09/article/details/8775518
Tensorflow博客,padding、strike这些:http://www.cnblogs.com/hellocwh/p/5564568.html

### 卷积神经网络在自然语言处理中的应用 卷积神经网络(CNN)不仅限于计算机视觉领域,在自然语言处理(NLP)方面同样表现出色[^1]。通过利用文本数据的空间结构特性,CNN能够在诸如情感分析、语义相似度计算以及短语分类等任务上取得良好效果。 #### 特征提取机制 对于一段给定的文字序列而言,首先会被转换成词向量表示形式;之后输入到由多个过滤器组成的卷积层中去。每一个滤波器负责扫描整个句子长度范围内的局部区域——即n-gram窗口大小,并从中抽取有意义的信息片段作为新特征[^4]。 ```python import torch.nn as nn class TextCNN(nn.Module): def __init__(self, vocab_size, embed_dim=100, num_filters=[100]*3, filter_sizes=[3,4,5]): super(TextCNN, self).__init__() # Embedding layer self.embedding = nn.Embedding(vocab_size, embed_dim) # Convolution layers with different window sizes (filter sizes) conv_blocks = [] for fs in filter_sizes: conv = nn.Sequential( nn.Conv1d(in_channels=embed_dim, out_channels=num_filters[fs//2], kernel_size=fs), nn.ReLU(), nn.MaxPool1d(kernel_size=(vocab_size-fs+1)) ) conv_blocks.append(conv) self.conv_blocks = nn.ModuleList(conv_blocks) def forward(self,x): embedded_sent = self.embedding(x).permute(0,2,1) pooled_outputs = [conv_block(embedded_sent).squeeze(-1) for conv_block in self.conv_blocks] output = torch.cat(pooled_outputs,dim=-1) return F.log_softmax(output,dim=-1) ``` 这段代码展示了如何构建一个多通道的一维卷积模型来处理变长的文本输入。这里采用了三种不同宽度的滑动窗以捕获更丰富的上下文模式。 #### 处理固定长度之外的情况 当面对不定长的文档或者评论时,则可以通过填充(padding)的方式使得每条记录达到相同的尺寸以便统一处理。另外还可以采用全局最大池化(global max pooling),它会选取每个feature map上的最大值而不考虑具体位置,这样就不再受限于原始样本的具体规模了。 #### 应用实例 - **情感分类**:判断一条微博是正面还是负面情绪表达; - **问答匹配**:衡量两个问题之间的关联程度; - **主题建模**:自动归纳文章所属类别标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值