mlnet是什么意思啊?

Python015

mlnet是什么意思啊?,第1张

mlnet应该是指的ML.NET ,它是一个跨平台框架,可以允许 .NET 开发人员开发专属模型,并在他们的应用程序中注入定制的机器学习能力,开发人员不需要具备开发或调节机器学习模型的专业知识。

ML.NET 由微软研究院研发,在过去的十年里发展成为一个重要的框架,它在微软的许多产品团队中都有使用,比如 Windows、必应、Azure 等等。

google在2018年10月底公布BERT在11项nlp任务中的卓越表现,NLP任务的两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等,此后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火、整个ML界略有耳闻的模型。

BERT的出现,彻底改变了预训练产生词向量和下游具体NLP任务的关系,提出龙骨级的训练词向量概念。

词向量,就是用一个向量的形式表示一个词。

(1)one-hot编码:词的符号化。

(2)词的分布式表示:词的语义由其上下文决定。以(CBOW)为例,如果有一个句子“the cat sits one the mat”,在训练的时候,将“the cat sits one the”作为输入,预测出最后一个词是“mat”。分布式表示的较大优点在于它具有非常强大的表征能力,比如n维向量每维k个值,可以表征k的n次方个概念。

其中,词嵌入就是分布式表示的一种:基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。核心依然是上下文的表示以及上下文与目标词之间的关系的建模。本质:词向量是训练神经网络时候的隐藏层参数或者说矩阵。

两种训练模式:CBOW (Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model)

NLP任务分成两部分,一是预训练产生词向量,二是对词向量操作实现特定功能。而词向量模型是一个工具,可以把抽象存在的文字转换成可以进行数学公式操作的向量,而对这些向量的操作,才是NLP真正要做的任务。从word2vec到ELMo到BERT,做的其实主要是把下游具体NLP任务的活逐渐移到预训练产生词向量上。

(1)word2vec:上下文概率的一种表示,但无法对一词多义进行建模

(2)ELMo:用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

在预训练好这个语言模型之后,ELMo就是根据下面的公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为ELMo。

然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的NLP有监督模型里。

(3)bert

word2vec——>ELMo:

结果:上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。

操作:encoder操作转移到预训练产生词向量过程实现。

ELMo——>BERT:

结果:训练出的word-level向量变成sentence-level的向量,下游具体NLP任务调用更方便,修正了ELMo模型的潜在问题。

操作:使用句子级负采样获得句子表示/句对关系,Transformer模型代替LSTM提升表达和时间上的效率,masked LM解决“自己看到自己”的问题。

(1)bert模型证明了双向预训练对于语言表示的重要性。与采用单向语言模型进行预训练的模型不同,BERT使用masked language models 进行预训练的深层双向表示。

(2)经过预训练的模型表示解决了许多为特定任务而设计架构的需要。BERT是第一个基于微调的表示模型,它在一系列句子级和词级别的任务上实现了最先进的性能,优于许多具有特定任务架构的系统。

bert架构由两步实现:预训练和模型微调;在预训练阶段,基于无标注数据通过多轮预训练任务完成。在微调阶段,bert模型由预训练的参数进行初始化,然后由待下游的任务数据进行参数微调。

bert模型是多层双向transformer编码器。将层的数量(Transformer blocks)表示为L,隐藏的大小表示为H,而self-attention heads 为A。在所有的情况下,我们将feed-forward/filter大小设置为4H,即H=768时,为3072, H=1024时,为4096.

bert的两种格式:

BERTBASE : L=12, H=768, A=12, Total Parameter=110M,

BERTLARGE : L=24, H=1024, A=16, Total Parameters=340M

为了使用bert可以应对各式各样的下游任务,bert的输入为token序列,它可以表示一个句子或句子对(比如对话)。使用该方案,输入可以是任意跨度的相邻文本,即一个token序列可以是单个句子,也可以是多个句子。

具体地说,bert使用30000个词的词级别的embeddings。每个序列的起始token是[CLS]。句子对被打包在一个序列中,用两种方式区别句子。方法一,使用特殊token[SEP];方法二,在每个标记中添加一个学习过的嵌入,表示它是属于句子A还是句子B。

两个无监督任务对BERT进行训练。

任务一:Masked LM语言模型。

为了训练双向表示模型,随机按百分比的方式(一般选15%)屏蔽输入序列中的部分词,然后预测那些屏蔽词。在这种情况下,屏蔽词的最终隐向量经softmax运算后输出。有点类似于中文的完形填空。

虽然如些操作可以获得一个双向的预训练模型,但这在预训练和微调之间创建了一个不匹配,因为在微调过程中从来没有见过[MASK]词。为了减轻这一点,我们并不总是用实际的[MASK]词替换被屏蔽的词。相反,生成随机选择15%的词进行预测,例如在句子 my dog is hairy 选择了 hairy。接着执行下面的过程:

数据生成器不会总是用[MASK] 替换所选单词,而是执行以下操作:

80%的时间,将单词替换为[MASK]词。例如 my dog is hairy ->my dog is [MASK]

10%的时间, 用一个随机词替换这个词, 例如 my dog is hairy ->my dog is apple

10%的时间, 保持单词不变,例如 my dog is hairy ->my dog is hairy。

每一轮使用交叉熵损失来预测原始词。

任务二:下一句的预测;

许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都基于理解两个文本句之间的关系,而语言建模并不能直接捕获到这两个文本句之间的关系。为了训练一个理解句子关系的模型,我们预训练了一个二分类的预测下一个句子的任务,该任务可以由任何单语语料库生成。

具体来说,在为每个训练前的例子选择句子A和B时,50%的时间B是A后面的实际下一个句子,50%的时间B是来自语料库的随机句子。例如:

Input =[CLS] the man went to [MASK] store [SEP],he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP],penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

我们完全随机选择NotNext 句子,最终预测模型在这个任务中达到97%-98%的准确率。

预训练数据:预训练过程很大程度上依赖现有语言模型的数据。从维基百科上抽取文本信息,忽略列表,表格和标题。对于预训练过程来说,使用文档级别的语料库而不是经过乱序后的句子级语料库来提取长的连续序列是很重要的。

对于序列级别分类任务,BERT微调很简单。BERT使用self-attention机制来统一两个过程。因为编码文本序列中,使用self-attention有效地包含了两上句子之间双向交叉的attention。

微调过程,就是对于每一个任务,简单地将特定的输入和输出接入bert,然后端到端地调节全部参数即可。在输入端,句子A和句子B类似于(1)语义句子对(2)假设前提(3)问答中的问句(4)文本分类或序列标记中文本。在输出端,token向量被传递给token级别任务的输出层,例如,序列标签,问答对的答案。[CLS]向量被传递给分类的输出层,用于分类或情感分析。

相对于预训练,微调要相对容易。大多数模型超参数与预训练相同,除了批的大小、学习率和训练轮数。

可以通过一个额外的输出层对预训练的BERT表示进行微调,以创建适用于各种任务的最先进模型,比如问答和语言推断,无需对特定与任务的架构进行实质性修改。

第一,如果NLP任务偏向在语言本身中就包含答案,而不特别依赖文本外的其它特征,往往应用Bert能够极大提升应用效果。

第二,Bert特别适合解决句子或者段落的匹配类任务。就是说,Bert特别适合用来解决判断句子关系类问题,这是相对单文本分类任务和序列标注等其它典型NLP任务来说的,很多实验结果表明了这一点。

第三,Bert的适用场景,与NLP任务对深层语义特征的需求程度有关。感觉越是需要深层语义特征的任务,越适合利用Bert来解决

第四,Bert比较适合解决输入长度不太长的NLP任务,而输入比较长的任务,典型的比如文档级别的任务,Bert解决起来可能就不太好。

【引用】:

bert论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://www.cnblogs.com/robert-dlut/p/8638283.html

https://blog.csdn.net/DarrenXf/article/details/89184225

https://www.cnblogs.com/xlturing/p/10824400.html

https://www.cnblogs.com/ylHe/p/10193166.html

如何使用JavaScript构建机器学习模型

目前,机器学习领域建模的主要语言是 Python 和 R,前不久腾讯推出的机器学习框架 Angel 则支持 Java 和 Scala。本文作者 Abhishek Soni 则用行动告诉我们,开发机器学习模型,JavaScript 也可以。

JavaScript?我不是应该使用 Python 吗?甚至 Scikit-learn 在 JavaScript 上都不工作。

这是可能的,实际上,连我自己都惊讶于开发者对此忽视的态度。就 Scikit-learn 而言,Javascript 的开发者事实上已经推出了适用的库,它会在本文中有所提及。那么,让我们看看 Javascript 在机器学习上能够做什么吧。

根据人工智能先驱 Arthur Samuel 的说法,机器学习为计算机提供了无需明确编程的学习能力。换句话说,它使得计算机能够自我学习并执行正确的指令,无需人类提供全部指导。

谷歌已经把自己移动优先的策略转换到人工智能优先很久了。

为什么 JavaScript 在机器学习界未被提及过?

慢(真的假的?)

矩阵操作很困难(这里有库,比如 math.js)

仅用于 Web 开发(然而这里还有 Node.js)

机器学习库通常是在 Python 上的(还好,JS 的开发者人数也不少)

在 JavaScript 中有一些可供使用的预制库,其中包含一些机器学习算法,如线性回归、SVM、朴素贝叶斯等等,以下是其中的一部分。

brain.js(神经网络)

Synaptic(神经网络)

Natural(自然语言处理)

ConvNetJS(卷积神经网络)

mljs(一组具有多种功能的子库)

首先,我们将使用 mljs 回归库来进行一些线性回归操作。

参考代码:https://github.com/abhisheksoni27/machine-learning-with-js

1. 安装库

$ npm install ml-regression csvtojson

$ yarn add ml-regression csvtojson

ml-regression 正如其名,负责机器学习的线性回归。

csvtojson 是一个用于 node.js 的快速 CSV 解析器,它允许加载 CSV 数据文件并将其转换为 JSON。

2. 初始化并加载数据

下载数据文件(.csv),并将其加入你的项目。

链接:http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv

如果你已经初始化了一个空的 npm 项目,打开 index.js,输入以下代码。

const ml = require('ml-regression')

const csv = require('csvtojson')

const SLR = ml.SLR// Simple Linear Regression

const csvFilePath = 'advertising.csv'// Data

let csvData = [], // parsed Data

   X = [], // Input

   y = []// Output

let regressionModel

我把文件放在了项目的根目录下,如果你想放在其他地方,请记得更新 csvFilePath。

现在我们使用 csvtojson 的 fromFile 方法加载数据文件:

csv()

   .fromFile(csvFilePath)

   .on('json', (jsonObj) =>{

       csvData.push(jsonObj)

   })

   .on('done', () =>{

       dressData()// To get data points from JSON Objects

       performRegression()

   })

3. 打包数据,准备执行

JSON 对象被存储在 csvData 中,我们还需要输入数据点数组和输出数据点。我们通过一个填充 X 和 Y 变量的 dressData 函数来运行数据。

function dressData() {

   /**

    * One row of the data object looks like:

    * {

    *   TV: "10",

    *   Radio: "100",

    *   Newspaper: "20",

    *   "Sales": "1000"

    * }

    *

    * Hence, while adding the data points,

    * we need to parse the String value as a Float.

    */

   csvData.forEach((row) =>{

       X.push(f(row.Radio))

       y.push(f(row.Sales))

   })

}

function f(s) {

   return parseFloat(s)

}

4. 训练模型开始预测

数据已经打包完毕,是时候训练我们的模型了。

为此,我们需要写一个 performRegression 函数:

function performRegression() {

   regressionModel = new SLR(X, y)// Train the model on training data

   console.log(regressionModel.toString(3))

   predictOutput()

}

performRegression 函数有一个方法 toString,它为浮点输出获取一个名为 precision 的参数。predictOutput 函数能让你输入数值,然后将模型的输出传到控制台。它是这样的(注意,我使用的是 Node.js 的 readline 工具):

function predictOutput() {

   rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) =>{

       console.log(`At X = ${answer}, y =  ${regressionModel.predict(parseFloat(answer))}`)

       predictOutput()

   })

}

以下是为了增加阅读用户的代码

const readline = require('readline')// For user prompt to allow predictions

const rl = readline.createInterface({

   input: process.stdin,

   output: process.stdout

})

5. 大功告成!

遵循以上步骤,你的 index.js 应该是这样:

const ml = require('ml-regression')

const csv = require('csvtojson')

const SLR = ml.SLR// Simple Linear Regression

const csvFilePath = 'advertising.csv'// Data

let csvData = [], // parsed Data

   X = [], // Input

   y = []// Output

let regressionModel

const readline = require('readline')// For user prompt to allow predictions

const rl = readline.createInterface({

   input: process.stdin,

   output: process.stdout

})

csv()

   .fromFile(csvFilePath)

   .on('json', (jsonObj) =>{

       csvData.push(jsonObj)

   })

   .on('done', () =>{

       dressData()// To get data points from JSON Objects

       performRegression()

   })

function performRegression() {

   regressionModel = new SLR(X, y)// Train the model on training data

   console.log(regressionModel.toString(3))

   predictOutput()

}

function dressData() {

   /**

    * One row of the data object looks like:

    * {

    *   TV: "10",

    *   Radio: "100",

    *   Newspaper: "20",

    *   "Sales": "1000"

    * }

    *

    * Hence, while adding the data points,

    * we need to parse the String value as a Float.

    */

   csvData.forEach((row) =>{

       X.push(f(row.Radio))

       y.push(f(row.Sales))

   })

}

function f(s) {

   return parseFloat(s)

}

function predictOutput() {

   rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) =>{

       console.log(`At X = ${answer}, y =  ${regressionModel.predict(parseFloat(answer))}`)

       predictOutput()

   })

}

到你的终端上运行 node index.js,得到的输出会是这样:

$ node index.js

f(x) = 0.202 * x + 9.31

Enter input X for prediction (Press CTRL+C to exit) : 151.5

At X = 151.5, y =  39.98974927911285

Enter input X for prediction (Press CTRL+C to exit) :

恭喜!你刚刚在 JavaScript 中训练了第一个线性回归模型。