06. 机器学习入门2 - 理解特征和向量-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录


茶桁的AI秘籍 06

Hi, 你好。我是茶桁。

上一节课咱们用一个案例引入了机器学习的话题并跟大家讲了一下「动态规划」。

那这节课我们要真正进入机器学习。

机器学习初探

在正式开始之前我们来想这样一个问题我为什么要先讲解「动态规划」然后再引入机器学习呢

原因其实是这样曾经有一度时间差不多一九七几年开始大概有三十四年动态规划其实可以变成图和树的问题。计算机科学里图和树其实是占主流的人们去解决图像的分割图像的分类文本的识别文本的分类问题有很大一部分都会将其优化为图和树的问题去解决。包括上两节课中我们提到的李开复去解决语音识别的问题也是拆分成语言树。

为什么要优化成图和树来解决呢因为这个技术在当时非常的成熟。但是因为有了图和树那么依照我们上一节的分析树会继续向下细分成更小的树也就是会形成子图。

所以人们就会发现当我们将问题优化成图和树之后再使用动态规划就能让问题加速解决。也就是像我们上节课中所讲的一样。有时候甚至不用动态规划都无法解决。

可是动态规划是有局限的当问题过度复杂的时候使用动态规划也开始解决不了了。

这个问题的一个非常经典的案例是一九九几年的时候当时电子邮件开始兴起也就催生了一个非常重要的产业就是垃圾邮件。因为垃圾邮件成本很低只要有一个服务器然后不断的发送就可以了。

比如邮件内容可以写

因为你经常上网我获得了你的一些账户密码我已经将你的一些见不得人的浏览记录都记录下来了需要你在三天之内向某个账户转多少多少钱否则我将公布你的所有记录。

我知道你们肯定会有人觉得这么弱智的诈骗邮件都能得逞啊但其实是能得逞的垃圾邮件不像诈骗电话还需要人拨。当然我知道现在诈骗电话都不需要人值守了只要有一个电脑连上电话服务然后AI会自动打电话通过AI合成语音就可以。但是当时那个年代可没有这个发邮件相对就简单很多只需要有一个服务器在那不断的发送就行了。

家在之前的数学课中应该都学过概率了。这里也就涉及到了一个概率问题我发10000个邮件哪怕只有一个人会上钩那我也会挣钱。所以当时发送垃圾邮件是一个很大的产业。

既然有人为这个东西所困扰就会有人想着用通过正当的方式去挣钱。当时网易的163还有美国最早的各种邮箱比如Hotmail等等都提供了一个功能是付费提供拦截垃圾邮件的功能。

当时垃圾邮件可以多到整个互联网上收到的99.8%的邮件都是垃圾邮件。如果不花钱基本上都用不了邮箱因为邮箱地址也是可以随机生成的。

结果像什么163还有Hotmail等等要去攻克垃圾邮件而垃圾邮件要去绕开他们的防锁要能诈骗到钱。就进行了这样的反复的斗争。

那这个时候的程序员是怎么做的呢很简单他们用的想法也是一样就是要分析文字分析语法把它变成文字树语法树变成文本关系。

我们想想垃圾邮件规律是不是基本上找不到只要找到一种规律它马上可以变。就算找到了一种规律把它写成代码了但是做垃圾邮件的人很快就可以攻克。

当时人们就很头疼完全没有办法。用这种分析的方法用类似于动态规划等的分析方法解决不了。

当时哈佛大学有一个老师用了一种方法叫做基于统计的文本贝叶斯分析方法来判断一个邮件是不是垃圾邮件。

他说不要人工去定规则不要人工去分析去找规则。假如在这里找到2万个垃圾邮件然后现在来了一条新的邮件我不知道内容但是可以根据以前这2万个垃圾邮件根据它里边的这个文本的内容文字看一下之前的垃圾邮件里出现的次数到底是多少就可以进行贝叶斯分类。

也就是说里面的单词分别在垃圾邮件里出现了多少次出现次数多不多等等。这个时候就可以给他一个概率比方说是垃圾邮件的概率是0.7非垃圾邮件的概率是0.3那就可以判定是垃圾邮件。

在以前人们都是写一个方法来判断是或不是而现在则是变成了一种概率。

结果人们就发现这样非常好做这样做其实也做不到100%正确。虽然做不到100%正确但是可以做一个比较高的准确度可以拦截大部分垃圾邮件。

而且它可以自动更新只要把这个程序放这不断的有垃圾邮件进来样本库越来越多接下来再收到新的邮件就能够知道这个是不是垃圾邮件了。

当时大家还会融入统计分析方法后来人们就发现根据原来的这些信息提炼出一些数据让机器自动或半自动的提炼出一些信息然后去预测新问题。这个过程就特别像小孩学习的时候你给他很多知识他自己去学学完之后去解决没有见过的问题。

这种解决问题的方法后来就叫做机器学习。我们就把解决这种问题的整个方法就叫做机器学习。

之前的这一些内容也就是咱们机器学习产生的背景。

特征和向量

对于整个世界上的所有东西来说都是可以被量化的。在管理学上有一个东西叫做 if one thing cannot be measure it cannot be managed。就是一个事情如果不能被量化它就不能被管理。

在科学上其实也有一个笛卡尔当年就说过如果一个东西不能被量化那么它就不能被分析。

比方说一个人要衡量这个人要刻画这个人的特点你可以给出特点。例如说身高一米73月收入18000。假如我们用0和1来表示到底是男还是女, 200910表示的可能是住址编码28可能是年龄。

这个时候我们就会得到一个东西如果我们把一位男士的信息抽象成这样一个向量。

假如有另外一个向量这个向量我们把叫做man2。如果man2和man的向量的距离是接近的我们就知道其实它里边的数值是接近的。因为它的向量的计算值比较小意味着每一个对应的两个数字之间比较小。

所以当我们把一个一个的对象能够量化变成一个向量之后我们就能够知道哪些向量之间是相似的哪些对象之间是相似的。

除此之外不仅是人还可以把邮件也处理一下。

假如说一封邮件里面包含了213个字符包含了1个关键字标题长度为270个抄送地址。那么邮件也是可以向量化各种东西都可以被向量化。

向量化之后就可以有一个什么样的结果呢假如存在一种函数
f 1 ( m a n → = [ 1.75 18000 1 200910 28 ] ) \begin{align*} f_1 \begin{pmatrix} \overrightarrow {man} = [ \\ \\ 1.75 \\ \\ 18000 \\ \\ 1 \\ \\ 200910 \\ \\ 28 \\ \\ ] \end{pmatrix} \end{align*} f1 man =[1.7518000120091028]

我们来看上面这个式子这一串数字代表的是我们现实生活中的一个对象。这个函数现在我们虽然不知道它是啥但是我们知道输入一个向量给到一个函数这个函数可以产生出不同的东西。

image-20231007142100435

假如这个函数返回0.75 或者是1.38负一点几等等。只要是个连续的数字属于R。这个函数就是一个回归函数Regression。

一个函数它返回出来的只有+1和-1 或者只有0和1两种结果。我们就把它叫做二分类。

如果返回3个值这三个值加起来等于1每一个表示的是某个东西的概率那我们把这个叫做多分类。

分类函数和回归函数是机器学习里边最典型的两个函数。

分类函数大家好理解它给出来的结果表示的是类别的概率。例如说是1就表示可能是a类别-1可能是b类别。

0.2、0.7、0.1表示三类第二类的概率最大。

Regression回归是什么意思呢

回归这个词当年其实是一个生物学概念一个遗传学概念。指的是生物的下一代的特征会更偏向于群体的平均值。

比方说姚明两米多一个正常人的身高是1米75,那么姚明的儿子的身高大概率会向着1米75这个方向变,而不会变得更高。也就是说姚明的儿子大概率会比姚明低。一个人个子特别矮他儿子大概率呢会比爸爸高。这个就叫做回归现象。

与此同时其实在我们的整个职业发展中也有这样的情况。假如说一个人特别优秀大概率他儿子不会像他那么优秀生物学上把这个遗传线叫做回归。

后来呢生物学家、包括心理学家就发现回归其实本质上是我们的平均值整体趋势的平均值。所以当时统计学家也用了这个词他们把群体趋势就叫做Regression就叫做回归。

后来在机器学习里所谓的群体趋势其实就是假设我们现在有这么多点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在这个群体的趋势假设是这样我们拟合了一个函数f(x)红色直线。 那么我们输入一个f(x)输入到这条直线里面, 就可以得到一个实数的输出这样的过程就叫做Regression。

当我们输入一个数字的时候不仅可能会输出概率可能还会输出一连串东西。

例如我们现在是一个决策问题输入了一个情况到一个函数里面要预测接下来我们该怎么办。

image-20231007142408435

我们输入了行动1、行动2、行动3、行动4…我们把这种学习问题叫做sequence就是序列问题。

image-20231007142917934

比如输入的是1、2、3、4这四个人的信息输出是3、2、4、1给这四个人排了个序。这种排了个序的事情我们就把它叫做rank尤其是在推荐系统在搜索引擎里面用的非常非常多。同理输入一个Email其实也可以做这样的事情。

那我们一起来想一下假设我们有一个f(x)f(x)具体怎么实现先不管。假设存在一个f(x), 如果我们要让f(x)执行一个Regression的任务可以想一下这个f(x)可以是在什么场景下。
f ( x ) ( e m a i l → = [ 213 1 27 0 ] ) \begin{align*} f(x) \begin{pmatrix} \overrightarrow {email} = [ \\ \\ 213 \\ \\ 1 \\ \\ 27 \\ \\ 0 \\ \\ ] \end{pmatrix} \end{align*} f(x) email =[2131270]

举个例子比方说要让f(x)执行一个rank任务它的场景是这里有十封未读邮件要排个序。要输出哪些邮件最紧急然后去回复。这就是一个rank的场景。

再举一个例子如果这个f(x)要执行的任务是一个多分类任务可以是在什么场景下。就是邮件分组对吧所以我们可以看到只要我们可以把一个一个对象表示成向量当我们有一个函数的时候就可以执行各种各样的任务了。

那我现在问如果这个f(x)要做Regression可能是哪个场景呢

机器学习其实就是反反复复的在做这么一件事情就是让机器半自动的得到这个f。注意是半自动它并不能全自动。

在求解f的过程中我们需要输入一个x真正的值是多少是有标准答案的。f算的对还是错是有标准答案的。

比方说贝叶斯、SBM、决策树、神经网络这些其实都是一种f。里边这些关键参数是机器自动获得的但是到底这个函数类型是什么是概率式、还是if else的还是神经网络这种形式得人来定。

f有标准答案是有对错的。我们把这种有对错的求解函数的方法叫做监督学习。

为什么有对错就要监督学习呢就是在整个学习过程中也就是整个获得f的过程中我们会不断的监督他看他学对了还是学错了。如果学对了就给他沿着正确的方向继续走如果学错了就要换一个方向。这就叫监督学习。

除了监督学习之外还有一种机器学习的方法是让机器自动去归类。
m a n 01 → m a n 02 → m a n 03 → m a n 04 → m a n 05 → m a n 06 → m a n 07 → m a n 08 → m a n 09 → m a n 10 → m a n 11 → m a n 12 → m a n 13 → m a n 14 → m a n 15 → m a n 16 → \begin{align*} \overrightarrow {man01} \qquad \overrightarrow {man02} \qquad \overrightarrow {man03} \qquad \overrightarrow {man04} \\ \overrightarrow {man05} \qquad \overrightarrow {man06} \qquad \overrightarrow {man07} \qquad \overrightarrow {man08} \\ \overrightarrow {man09} \qquad \overrightarrow {man10} \qquad \overrightarrow {man11} \qquad \overrightarrow {man12} \\ \overrightarrow {man13} \qquad \overrightarrow {man14} \qquad \overrightarrow {man15} \qquad \overrightarrow {man16} \\ \end{align*} man01 man02 man03 man04 man05 man06 man07 man08 man09 man10 man11 man12 man13 man14 man15 man16

假如有很多人我们希望机器能自动的把这些人根据某些特征自动的进行一个分类。在这个过程中其实是没有标准答案的是机器根据这些向量自动分类的。我们把这种学习方式叫做非监督学习也叫做聚类。

image-20231007151705074

非监督学习的难点就是我们不太好衡量到底是不是对的还是错的。万一这个分类不是我们需要的分法就只能改变参数让它再分一遍了。

所以非监督学习不好量化它的结果只能作为参考没有标准答案。

机器学习的通用框架

不管是做什么机器学习不管是在小公司还是大公司还是在航空航天局。不管是在哪里我们都有一个通用的方法。

未命名

首先observed data, 会有一些观察到的数据。观察到的数据之后我们就要进行一件叫做特征提取的事情。特征提取就是把我们观察到的这些数据变成一个一个向量。

观察到的是路边上的一个一个的人我们要把这一个一个的人变成一条一条的向量。变成向量之后就要进行所谓的学习。这个学习就是需要根据原来的向量在人的指导下去优化一些函数得到一些函数的参数。

然后这个函数要能预测新的没有见过的也就是New Data部分是没有见过的一些新数据要能得到结果图中就是得到y。这是我们整个学习的过程整个机器学习基本上都是这样的一套流程。

那什么叫做监督学习呢监督学习就是在学习的这个过程中每次为了获得f会输入一对一对的x和y。y就指的是我们在训练的时候我们已知的这些数据的x以及对应的值。

通过这些大量对应的值机器自动去总结规律抽象规律得到f。

监督学习就是在学习的时候我们会给到机器x和y, y就指的是这个x对应的值。而非监督学习就不提供这些东西。

非监督学习只提供x经过x之间的向量的距离近不近等等自动的去获得x的分类。

梯度下降

在这个求解f的过程中监督学习的时候有一个非常非常重要的方法叫做「梯度下降」。

梯度下降是一个非常重要的点之后的课程中咱们会讲到。

假如我们有一组k和b输入一个x可以得到一个y。假如就是kx+b = y我们现在其实是想求一组k和一组b能够使得我们输入任意的x的时候得到的值都任意的和y接近。

还是拿上边这个函数来讲比如f(x) = kx + b, 我们现在想求一组k和一组b,让它和y的值越接近越好。我们怎么来评价它越接近越好呢 写一个函数 ∑ [ ( k x + b ) − y ] 2 \sum [(kx+b)-y]^2 [(kx+b)y]2这个我们把它叫做loss函数 l o s s = ∑ [ ( k x + b ) − y ] 2 loss =\sum [(kx+b)-y]^2 loss=[(kx+b)y]2 表示这个值如果越大我们信息差的越多这个值越小就表示我们信息保留的越好丢失的越少。

其实原理就是要获得一组k和b然后使得loss取最小值。为了求得一组k和b让这组k和b能够使我们的函数最接近于我们真实的值可以给他一个随机值然后让loss去给k求偏导。

如果此时此刻求出来的偏导是大于0的就是随着k的减小loss值要减小。如果loss对k的偏导小于0意味着随着k的增大loss要减小。

那新获得的k就等于原来的k加上loss给k求偏导的相反数。
k 2 = k 1 + ( − 1 ) ∂ l o s s ∂ k × ∝ k_{2} = k_{1} + (-1) \frac{\partial loss}{\partial k} \times \propto k2=k1+(1)kloss×

当然我们最后乘上了一个系数这个系数必须是一个很小的数字比如说是0.001。这个系数的作用是什么遇到的一些函数偏导特别大但是此时我们其实已经很接近那个最优点了可是偏导特别的垂直。那在这里就要加一个很小的系数控制一下。

这里要说一下这个部分不能死记公式没什么所谓的公式都是一些比较基础的数学知识。这也就是为什么我之前花那么久来写数学基础的原因。

另外就是在数学基础之上要拿出你的笔和纸当然平板也可以要多画画然后你就懂了。如果这个东西不多动笔觉得要背下来劝你趁早别干这行了也别学了可以去做个文职的工作就天天背书就可以了。现在学的这些东西一定是要内化的一定要拿着笔多练多敲代码。

与此类似的b也可以做这样的运算 b 2 = b 1 + ( − 1 ) ∂ l o s s ∂ b × ∝ b_{2} = b_{1} + (-1) \frac{\partial loss}{\partial b} \times \propto b2=b1+(1)bloss×。这样经过我们不断地输入x和y就能够慢慢地找到一组最优的k和b了。这个就是梯度下降所做的事情。

接下来咱们就演示一下梯度下降的意义。

我们现在有一个loss函数这个函数会返回一个运算结果如下

def loss(k):
    return 3 * (k ** 2) + 7 * k - 10

现在对于k的偏导我们把2放下来那就是6*k再加上7:

def partial(k):
    return 6 * k + 7

这个就是它的偏导。

现在给他随机出一个值, 为了让数据更明显我们将范围定在(-10, 10)之间。顺便给一个很小的系数alpha

import random
k = random.randint(-10, 10)
alpha = 1e - 3 # 0.001

接着我们来做循环。之前咱们分析过整个式子直接将其写出来就可以了最后是打印出k和loss(k)

k = k + (-1) * partial(k) * alpha
print(k, loss(k))

将这一段代码扔到循环里为了更明显我们让它循环100次完整代码如下

import random

def loss(k):
    return 3 * (k ** 2) + 7 * k - 10

def partial(k):
    return 6 * k + 7

k = random.randint(-10,10)
alpha = 1e-3 # 0.001

for i in range(100):
    k = k + (-1) * partial(k) * alpha
    print(k, loss(k))

---
-9.947 217.19942699999993
-9.894317999999998 214.43236005537193
-9.841952091999998 211.69839829966944
-9.789900379447998 208.99714566241215
...
-6.064345358065952 57.87843635922653
-6.034959285917557 57.01748574662477
-6.005749530202052 56.16683554715212

我们可以看到它的值一直在下降虽然不能直接求解出最好的那个k是什么但是通过梯度下降这样的方法一步一步的慢慢的就找到了这个函数的最小值。

当我们把循环次数再次提升到100000的时候我们来看看最后的结果

for i in range(100000):
    k = k + (-1) * partial(k) * alpha
    print(k, loss(k))

---
...
-1.1666666666666852 -14.083333333333332
-1.1666666666666852 -14.083333333333332
-1.1666666666666852 -14.083333333333332

最后几次打印出的结果基本趋于一致了k的值就是-1.1666那数学里边我们学过这个二次函数最优值应该是-b/2a应该是-7/6我们计算一下看看

image-20231007174350309

可以看到和我们梯度下降所求的值很接近几乎一致。

这个例子说明通过靠梯度下降是能够找到一个变量让这个函数取得最小值。

既然咱们刚才面对这个问题能直接能计算出来它的值是-b/2a = -1.16666…, 为什么要用梯度下降的方法来得到这个不精确的值呢?

我们的这个例子是一个简单函数可是当函数很复杂的时候很多复杂的函数我们是求解不出来的。

好到这里就是我们这节课的内容。下节课就是我们机器学习入门的最后一节课我们来谈谈K-means。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习