1.NLP.TM[19] | 条件随机场知识整理(超长文)
2.序列化推荐中的GRU与Transformer源码解析之一
3.大模型国产化适配5-百度飞浆PaddleNLP大语言模型工具链总结
4.在大学想要学习编程,可以通过哪些途径进行学习?
5.NLP入门课程推荐:斯坦福cs224N
6.3分钟学会用NLP构建一个智能问答系统
NLP.TM[19] | 条件随机场知识整理(超长文)
在近期的项目中,我利用条件随机场(CRF)解决了一个任务,取得了不错的效果,因此决定整理一下我对CRF的理解和实践经验。本文将从理论出发,资源猫APP最新源码介绍CRF的基本概念、理论框架,以及如何在实际问题中应用CRF。
### 理论框架
条件随机场(CRF)是一种基于概率的序列标注模型,它从概率无向图出发,通过引入条件随机场的概念,定义了在已知特定位置的标签和其相邻标签的条件下,不同标签出现的概率。CRF尤其适用于序列标注问题,如命名实体识别、句子分词等。
#### 条件随机场定义
CRF定义的核心是对于给定位置的标签Y,其在已知特征和相邻标签条件下出现的概率,与已知特征但相邻标签不同条件下出现的概率是相同的。这种定义在链式条件随机场中表现得更为清晰。理解这一定义是基础,但还不够,为了进行预测,我们还需要知道P(y|x)的直接关系,这里需要引入图论中的“团”概念来分解问题。
#### 条件随机场形式
CRF的参数化形式通过Hammersley-Clifford定理给出,其中的势函数一般采用指数函数形式。通过数学期望的概念,我们可以推导出线性链条件随机场的参数化形式。参数化形式由特征函数和权重组成,权重被抽象为待估参数,最终得到的公式为:
矩阵形式的CRF参数化表达式为:
这里的公式展示了CRF如何通过特征函数和权重矩阵来描述概率分布,为后续的模型训练和预测提供了数学基础。
### 条件随机场作为判别模型
虽然CRF在形式上与生成模型相似,但实际上它是一个判别模型。判别模型与生成模型的区别在于训练过程和目标不同。CRF通过最小化损失函数来学习参数,而不需要联合概率分布,这使其成为判别模型。
判别模型的核心在于直接学习输入特征到输出标签的映射关系,通过优化损失函数实现参数学习。CRF通过损失函数的最小化,学习到特征与标签之间的关系,从而直接进行预测。
### 实际应用
CRF在实际应用中,有多种实现方式,如TensorFlow和CRF++。TensorFlow提供了CRF接口,通过`tf.contrib.crf.crf_log_likelihood`接口计算对数似然值,使用维特比算法进行预测。nightmares源码而CRF++则是一个基于C++的序列标注工具,支持多种编程语言接口,通过构建规则模板来定义CRF结构。
#### TensorFlow实现
在TensorFlow中实现CRF主要通过`crf_log_likelihood`接口计算对数似然值,以及使用维特比算法进行预测。关键在于正确设置输入向量和状态转移矩阵。
#### CRF++实现
CRF++提供了序列标注功能,通过构建规则模板来定义CRF结构。使用规则模板可以轻松地设置CRF参数,进行训练和测试。CRF++通过命令行工具`crf_learn`和`crf_test`进行模型训练和预测。
### 总结
通过理论学习和实际应用,我们掌握了条件随机场的核心概念和使用方法。无论是TensorFlow还是CRF++,它们都提供了实现序列标注任务的强大工具。理解CRF的工作原理,不仅能够解决具体问题,还能够为后续的自然语言处理任务提供坚实的基础。
序列化推荐中的GRU与Transformer源码解析之一
GRU4Rec源码(TF版本):github.com/Songweiping/...
Transformer源码:github.com/kang/SASR...
序列化推荐领域中,GRU4Rec成功地将循环神经网络(NLP和时序预测常用)应用至推荐领域,此模型取得了良好效果。紧随其后的是"SASR",基于注意力机制的自适应序列推荐模型,实验表明其性能超越了GRU4Rec。
两篇论文的作者均在源码公开阶段,为研究者提供参考。我们深入剖析源码,后续系列文章将比较GRU4Rec与SASR的差异、联系与优缺点。
GRU4Rec模型结构简洁,采用门限循环神经网络,Embedding层处理item_id的one_hot编码,降低维度,便于优化。
并行化训练数据集优化了模型训练速度,构建了training_batch,便于使用GPU加速矩阵运算。
负采样技术提高了训练频率,利用同一时刻不同session中的item作为负样本。
模型设计了贝叶斯排序和TOP1等pairwise方法计算排序损失,认为pairwise结果优于pointwise。
实验数据集包括RSC和私有VIDEO集,结果表明GRU4Rec模型性能优秀,测试集评价指标包括召回率(recall)和倒序排名得分(mrr)。
深入分析模型的Tensorflow版本代码,主要从main.py和model.py文件开始,重点解析模型定义、损失函数、GRU4Rec核心代码、数据集初始化、unpackbootimg 源码模型训练与预测以及评估函数。
GRU4Rec的代码分析暂告一段落,后续将详细梳理SASR代码,目标是通过三篇文章全面探讨两个模型的细节。感谢关注。
大模型国产化适配5-百度飞浆PaddleNLP大语言模型工具链总结
在人工智能快速发展的浪潮中,国内外涌现了众多杰出的AI工具,如PyTorch、TensorFlow和百度飞浆、Oneflow、MindSpore等。其中,百度飞浆的PaddleNLP大语言模型工具链凭借其全方位的服务脱颖而出。PaddleNLP是一个功能强大的NLP库,集成了业界预训练模型,为开发者提供了即用的开发环境,适应了多场景需求,具有灵活性和定制性。
飞浆大语言模型工具链构建在飞桨的分布式并行技术基础上,旨在提供高效、易用的全流程服务,覆盖从开发、预训练到部署的各个环节。它支持多种主流开源大模型,如Bloom、LLaMA、OPT和ChatGLM等,涵盖了预训练、微调、压缩、推理和模型服务化。PaddleNLP在预训练阶段支持LLaMA v1/v2和GPT-3,而在微调方面,支持全量和高效微调策略,如LoRA和Prefix Tuning。
然而,尽管PaddleNLP在大模型支持方面表现出色,实际使用过程中仍存在一些挑战,如模型服务化部署的复杂性以及量化过程中的特定问题。尤其是模型量化,PaddleSlim提供了包括量化训练、动态离线量化和静态离线量化在内的方法,但Transformer模型的异常激活值处理需要特别注意,如Shift、Smooth和PieceWiseSearch策略。此外,GPTQ量化算法也提供了一种有效的权重量化方式。
总的来说,飞浆PaddleNLP在大模型工具链方面具有显著的潜力,但仍需不断优化以降低使用难度,萤石 源码提升用户体验。我们期待国产AI框架如飞浆能持续进步,为开发者带来更卓越的工具支持。
在大学想要学习编程,可以通过哪些途径进行学习?
一、先知道编程能帮我们干什么编程,其实已经不仅仅是“编写程序”这么狭义了,通过写代码让计算机帮我们做事都可以看作“编程”。这也是为什么,在注重高效率的今天,社会越来越推崇“少儿编程”与“全民编程”。
并且,现在的语言工具(比如python)已经降低了不少编程工作的复杂度,让我们在不了解编译过程的情况下,也能通过几行简洁的代码很棒地完成工作。
因此,我在这里总结一下,编程能帮我们做什么,已经做这个工作需要懂计算机到什么程度:
1. 日常办公、处理表格:
一是excel的功能已经够直观便捷、够强大了;二是0基础入门python,肯定要涉及到学习一些数据结构的相关知识,有这个时间,还不如好好看看excel有哪些强大功能。
2. 科学计算(运筹/机器学习/数值分析):
现在科学计算几乎难以与“编程”二字分家。做科学计算的人都是很聪明、学习能力很强的人,但其编程能力往往参差不齐,我这里划了三个档次:
- 2.1 不需要太多编程能力,重点在于结果而非编程: 很多朋友只是用用仿真软件、用R语言做做统计分析、用matlab做做拟合,他们的工作重点在于输出的结果,而非“编程”这个过程,那很显然,这类同学往往是类似物理、管理、社会学这类学科的从业者,都是很聪明能干的人,我认为在过程中学习,多看看前辈们的工作方式与工具,注重文件管理与编程规范(不要乱起文件/变量名字,也不要乱放文件…),学学github检索与使用,熟能生巧就好。
- 2.2 需要一定编程功底,如CV/NLP等ML/DL/OR从业者: 计算机视觉、自然语言处理、深度学习、机器学习、lazybug源码运筹学、线性求解器、启发式算法……这类研究是一定要拿计算机做实验的,并且用编程实现算法的入门并不简单。对于这类同学来讲,数学、数据结构是重点中的重点,“会用”python这类语言的同时,最好也掌握一下“面向对象的思想”与“函数式编程”,方便我们阅读框架源码;注重自己的编程习惯,配置一个好点的编辑器,持续学习(比如你了解jupyter notebook的快捷键与自动补全吗),咱也不能一直当个“调包侠”呀。有余力则应该去系统地学学计算机课程。
- 2.3 大神,我们用python调用的很开心的深度学习框架TensorFlow其实核心都是用c/c++写的哦!为什么用c/c++呢?我估计是为了更好的性能、对计算机算力更充分的利用。我们知道,c/c++是有指针的语言,这增加了编程难度,却也让开发者可以更好地对系统的虚拟空间进行管理。很多主流语言,比如java、python为了降低开发者编程难度,便取消了指针机制。这类人计算机功底必须极其扎实。
3. 软件工程师/开发者:
前端、后端、PC端、移动端、Web平台、全栈、网络安全、测试、运维、游戏等等,就是我们常说的“程序员”,工种其实太多了!自学编程的孩子如果是想成为这类工程师,那当然需要系统学习软件专业与计算机专业的专业课;但是我们大部分孩子只是想学学计算机,了解一下而已,因此第3条我们不展开讨论。
4. 其他很有趣的事:
日常生活中我们离不开手机、计算机,因此如果能写个“程序”,让计算机“自动”做一些工作,便蛮有趣的。比如,编程爱好者Sarthak agarwal[2]就写了许多python脚本文件,这其中有用自动下载、自动管理文件、自动发邮件的。这里,我不得不点明一个误区:虽然人们常说python很方便、强大,但只会python是远远不够做这些有趣的事的。比如,用python下载听起来很美好,但是不懂url、不懂网页布局,怎么可能做到呢?python说白了,只是一个方便的工具而已嘛。
二、再明确自己要拿编程做什么
编程能做什么,要学到什么程度,其实我在上文说的已经比较明白了。
自学编程大概两个阶段:
打基础,至少学懂一门语言,推荐拿C/C++入门(为了学到一些指针与面向对象的知识),拿Python入门也可,但你会发现面向对象在Python教学中可能不被强调,因为Python自带的工具已经很强大;
不推荐拿Java入门,因为Java实在是开发者用的语言,其魅力在于接口、程序设计,想拿Java入门,不如拿C/C++入门;
编程之理,一通百通。第二个阶段,就是多多实践、持续学习,在自己的领域探索下去:
如果你要搞数据科学、打数据比赛,就去多用熟悉python中的pandas、sklearn库等等;
如果想做线性求解,先找几个简单的java+线性求解器例子动手复现下来,读懂每行代码的作用,在过程中积累;
NLP入门课程推荐:斯坦福csN
初次接触NLP是在求学时期,同学推荐了一本书,书中提到了分词、TFIDF、BM等概念,后在吴军老师的《数学之美》中了解到统计学在NLP中的作用。工作后,专注于搜索、推荐领域,对NLP知识点仅停留在理论层面,缺乏实际操作经验。
涉足NLP原因有两个:一是业务发展,智能客服机器人上线效果显著,NLP应用日渐重要;二是深度学习热潮,希望通过学习NLP知识,促进深度学习在排序领域的应用。
工程背景使作者倾向从项目入手学习。在研究过程中,发现了char-rnn模型在文本生成方面的潜力,但效果有限。后尝试seq2seq+attention、DSSM、textCNN等模型,发现知识体系混乱。因此,作者决定参加一门课程系统学习NLP。
考虑到对斯坦福课程的深厚情感,选择参与斯坦福大学的csN课程。课程内容新颖,涉及依赖解析、核心句法解析、树递归神经网络与句法解析、强化学习等NLP领域,对NLP有了更全面的理解。同时,课程提供了高质量的论文资源,为后续深入研究提供便利。
学习过程中的感悟:一是国内大学在教学质量上与斯坦福等世界顶尖大学存在差距,但在线教育的发展在一定程度上缩小了这一差距。二是使用PyTorch实现常见模型,能够深入理解模型细节,相比TensorFlow更为简便。三是个人心路历程从对NLP的质疑到逐步深入,对NLP的挑战有了更深刻的认识。
推荐学习资源:斯坦福大学csN课程地址、课程视频地址。
最后,坚信NLP领域充满挑战与机遇,持续探索,不断进步。
3分钟学会用NLP构建一个智能问答系统
掌握NLP,构建智能问答系统不再是难题。本期内容将带您快速了解系统设计、关键技术以及简要代码示例,让构建过程更直观。
首先,智能问答系统的架构主要包括用户接口、预处理模块、语义理解模块、知识检索模块、答案生成模块和后处理模块。用户通过各种方式输入问题,预处理模块负责清理和解析,语义理解模块借助深度学习模型解析问题意图,知识检索则在海量信息中寻找答案,生成模块整合答案,后处理确保输出的专业性,反馈与学习模块则支持模型优化和知识库更新。
关键技术和工具包括NLP的文本处理技术、深度学习模型如BERT和GPT,以及可能用到的知识图谱查询和信息检索技术。例如,预处理可能用到spaCy或NLTK,语义理解则依赖预训练模型,知识检索可能需要与特定知识库接口配合。
以下是基础的Python代码示例,展示了预处理、语义理解、知识检索和答案生成部分的初步实现,但实际项目中,这些代码需要与具体框架(如TensorFlow或PyTorch)、NLP库和知识库接口深度结合,并进行详细配置和优化,以应对各种场景和性能需求。
智能问答系统的构建是一步步迭代和完善的,下次我们将深入探讨更具体的实现步骤。让我们一起探索这个充满可能性的技术世界吧!
面了知名企业的NLP算法岗(大模型方向),被考倒了。。。
在知名企业的NLP算法岗面试经历中,一位求职者分享了自己挑战重重的面试经历,特别是在大模型方向。面试过程涉及深度的技术考核和理论知识,不仅考验了候选人的算法基础,还对大模型的理解、实践和优化有高要求。字节跳动-抖音 NLP算法工程师一面
1. 自我介绍和项目经历
2. 手撕multi-head self-attention,使用tensorflow或torch
3. 解释deberta的优化点:disentangled attention和enhanced mask decoder
4. 介绍pre-norm和post-norm的区别
5. 层次探讨大模型应用、ChatGLM、LlaMa、qwen差异及Prompt优化
6. 大模型微调优化方法及其区别,涉及langchain和lama index
7. 大模型检索问题及RAG优化方法
8. 从零开始训练大模型流程和注意事项
拼多多-智能客服 NLP算法工程师一面
1. 自我介绍和项目经历
2. 重温层norm与batch norm
3. bert的mask策略与设计目的
4. 数据增强方法和模型蒸馏
5. 图的连通子图查找算法
6. 询问LangChain和知识库开发框架经验
深度学习框架TensorFlow系列之(六)反向传播之Embedding层
❝ 前面的章节中介绍了反向传播算法,基于Forward Pass和Backward Pass可以轻松地完成整个反向传播的过程,进行模型的构建。 ❞
但是,熟悉搜广推以及NLP、CV等领域的同学都知道,在这些深度模型中,往往存在着Embedding层,以搜广推为例,这些深度学习模型为了解决ID稀疏特征等问题,往往在模型的输入层之后跟着一个Embedding层,那么这个Embedding是如何实现反向传输的呢?
❝ 大家看到这个问题可能的第一反应是:这不很显然么?反向传播该怎么传播就怎么传播呗。但仔细一想,好像也不是那么简单。 下面我们分析下。 ❞
「以端到端的训练方式为例,进行分析」
![image-](/Users/dubaokun/Desktop/1-work/1-历练成长/文章发布/8 /文章/image-.png)
那么我们上面的描述是否正确呢?下面我们从代码角度来看下
❝ 由上面的结果,我们可以知道,Embedding层其实就是输入特征执行one-hot之后,与一个权重矩阵(em_weight)相乘的结果,因为特征经过one-hot编码,所以相乘的结果就是以one-hot值为索引号的权重矩阵(em_weight)的所对应的行。 ❞
从上面的代码中,我们可以看到,Embedding层相当于对特征做了一次变换,形成新的输入层,然后进行模型的构建,那么我们假设整个网络是N层的MLP,那么。
conda创建、查看、删除虚拟环境
在数据分析和科学计算中,Anaconda的虚拟环境功能非常实用。首先,创建虚拟环境是通过命令行进行的,例如,为了创建Python 3.6版本的环境,名为'nlp',可以使用如下指令:
conda create -n nlp python=3.6
删除虚拟环境时需谨慎,使用`conda remove -n nlp --all`命令,确保环境及其中的所有包都被移除。要激活虚拟环境,可以输入`conda activate nlp`,如果遇到问题,尝试先用`source activate nlp`,然后再次激活。
确认Python版本或查看当前环境已安装的包,可以使用`python --version`和`conda list`。在虚拟环境中安装包,无论是pip还是conda,如`pip install tensorflow`,请记住这些包在退出虚拟环境后将不可用。
退出当前虚拟环境使用`conda deactivate`。在Linux环境下,可以使用`conda-env list`查看所有虚拟环境。为了确保虚拟环境的正确切换,推荐在创建后使用`which python`检查编译器位置,例如在'nlp'环境中,输出应为`home/anaconda/envs/nlp/bin/python`。
若想重命名环境,虽然没有直接的重命名命令,但可以通过先创建一个克隆环境(`conda create -n tf2 --clone nlp`),然后删除原环境(`conda remove -n nlp --all`)来实现。在操作虚拟环境时,务必确保每个步骤的正确执行。
BERT(Transformer Encoder)详解和TensorFlow实现(附源码)
BERT,全称Bidirectional Encoder Representation from Transformers,源自Transformer的Encoder部分。其核心结构通过双向注意力机制,使得每个token能同时关注其前后文内容,形成双向上下文融合。相较于单向语言模型,BERT在复杂语言理解任务中展现出更强大的性能,如完形填空、问答系统、情感分析、目标导向搜索和辅助导航等。
BERT的训练机制包含两种创新的预训练策略:Masked Language Model(MLM)和Next Sentence Prediction(NSP)。MLM通过在句子中随机遮蔽部分词汇,促使模型基于上下文进行预测,增强词汇理解和错误纠正能力。NSP则判断两句话在语料中的连续性,强化句子级别的语言表征能力。
在BERT的架构中,每个输入token生成一个输出表示,对于任务不同,输出会用到额外的输出层进行预测。例如,对于完型填空或问答任务,使用每个token对应的输出;对于情感分类任务,则使用“[CLS]”对应的输出。
微调阶段,BERT在大量语料上训练后,可用于NLP的各个任务中。对于语义分析任务,构建模型时将BERT输出中的“[CLS]”符号输入到Dense层进行分类处理。通过加载BERT模型、预处理模型以及进行微调,最终完成任务的训练和推理。