機械学習入門(2)————————線形ユニットと勾配降下

         前回の記事を通じて、単純なパーセプトロンを学び、ステップ関数(2つの分類、シンプルで明確なハハと呼ばれることが望ましい)、およびパーセプトロンをトレーニングするためのパーセプトロンルールを理解しました。ここで、パーセプトロンは別の線形要素を学習します。この線形を使用して、モデル、目的関数、最適化アルゴリズムなど、機械学習のいくつかの基本的な概念を理解します。これを使用して、機械学習を簡単に理解します。

1.リニアユニット

       前のセクション述べたパーセプトロンの場合、以前のパーセプトロンのルールは線形に分離できないデータセットに収束できません。現時点では、パーセプトロンをトレーニングすることはできません。この問題を解決するために、私は誘導は、ある線形関数代わりパーセプトロンと呼ばれるステップ関数パーセプトロンの線形要素線形ユニットは、線形に分離できないデータセットに直面すると、最適な近似値に収束します。

      ここでは、単純な線形ユニットのアクティベーション関数fを想定しています  。f(x)= x

      線形単位は次のように表されます。

前のセクションとの比較:

アクティベーション関数fを置き換えた後、線形ユニットバイナリ分類0、1の代わりに実際の値を返すため、線形ユニットは分類の代わりに回帰問題を解決するために使用されます。

2.リニアユニットモデル

       モデルは実際には関数であると言われています(ps:私はこのように感じます、モデルは少し背が高いです~~笑)。

       実際には、入力x値に基づいて出力yアルゴリズムを予測します。たとえば、xは人の労働年、yは月給です。特定のアルゴリズムに従って、人の労働年に基づいて人の収入を予測できます。といった:

y = h(x)= w * x + b

       関数h(x)は仮説であり、w、bは彼のパラメーターです。w = 1000、b = 500、xが人の労働年であると仮定して、上記のモデルを代入して、彼は彼の月給が5500であると予測しました。このようなモデルは、他の要因が考慮されておらず、就業年のみが考慮されているため、少し信頼性がありません。就業年の場合、業界、会社、およびランク情報は特性と呼ばれますIT業界で3年間働いており、AlibabaでランクT3の人の場合、特徴ベクトルを使用して表現できます。

X =(3、IT、Ali、T3)

このとき、入力Xは4つの特徴を持つベクトルになりますが、逆に1つのパラメータwだけでは不十分で、3つのパラメータが必要です。合計4つのパラメータ(w1、w2、w3、w4)は添え字、各機能はパラメータに対応します。このときのモデルは次のようになります。

y = h(x)= w1 * x1 + w2 * x2 + w3 * x3 + w4 * x4 + b

x1:就業年数x2:対応する業界x3:対応する会社x4:対応するランク

このとき、w0をbに等しくし、w0をフィーチャx0に対応させます。これは、x0が存在しないため、x0 = 1、つまり次のように設定できます。

b = w0 * x0ここで、x0 = 1

したがって、上記の式は次のようになります。

y = h(x)= w1 * x1 + w2 * x2 + w3 * x3 + w4 * x4 + b(1)

             = w0 * x0 + w1 * x1 + w2 * x2 + w3 * x3 + w4 * x4(2)

ベクトルとして書かれたパターン:

上記の式、関数モデルは線形モデルと呼ばれ、yは線形の組み合わせの入力出力特性x1、x2、x3、...です

3つの監視付き学習と監視なし学習

モデルを持っていますが、どのようにトレーニングしますか?、パラメータwの選び方は?

学習監修:。それは、機械学習の方法を学習の一種であることは、モデルを訓練することで、サンプルの多くを提供し、これらのサンプルは、入力特徴Xと対応する出力y(yはとも呼ばれています。ラベル、ラベル) 。言い換えれば、私たちは多くの人々のデータを知る必要があります、彼らはすべてこれらの特徴を持っています:労働年、産業、会社、ランク、そして彼らの収入。これらのサンプルを使用してモデルをトレーニングし、モデルに各入力の特性(X)を知らせ、対応する質問への回答(yとマーク)も知らせます。モデルはこれらのサンプル(十分)を使用してルールを要約し、次に、表示されていない入力(X)と対応する回答を予測します。

監視なしの学習:このメソッドのトレーニングサンプルでは、​​Xだけにyがありません。モデルは機能xのいくつかの法則を要約できますが、対応する答えyを知ることはできません。(つまり、入力xを指定すると、出力yがありますが、yの値が正しいかどうかはわかりません)

        多くの場合、xとyのサンプルは非常に少なく、ほとんどのサンプルにはxしかありません。たとえば、Speech-to-Text(STT)認識タスクでは、xはスピーチであり、yはスピーチに対応するテキストです。スピーチで多くのデータを取得できますが、スピーチをテキストに変換して対応するテキストにラベルを付けるには、かなりの時間がかかります。現時点では、ラベル付きサンプルの不足を補うために、監視されていない学習方法を使用して最初クラスタリングを実行し、モデルに類似するシラブルを要約させてから、少数のラベル付きトレーニングサンプルを使用して、いくつかのシラブルが対応していることをモデルに伝えることができます。テキスト。このとき、モデルは類似の音節を類似の単語にマッピングして、モデルのトレーニングを完了することができます。

第四に、線形ユニットの目的関数

監視付き学習のみを検討してください

       監視付き学習では、サンプルとして、その特徴Xとラベルyがわかります。同時に、出力はモデルh(x)に従って計算されます。ここで、yはトレーニングサンプルのマークを表しますこれは実際の値です。下線はモデルによって計算された予測値を表します。yの値が非常に近い場合、モデルは良好です。

したがって、yと同様の値を表現する方法は、yとの差の些細な合計の1/2を使用して次のように表現できます

   E:のエラー単一サンプル簡単に計算するための1/2

トレーニングデータには多くのサンプルが含まれます。N個ある場合は、次のように、トレーニングサンプルをすべてのサンプルエラーと、エラーEモデルを表すために使用できます。

の方は最初のサンプルのエラーを示し、次のサンプルは最後までの2番目のサンプルを示します。

合計として書かれています:

上記式2において、それが表しているの特徴i番目の学習サンプルを、表すのマークi番目のサンプルの組をするために使用することができる、i番目表すトレーニングサンプルを

これは、i番目のサンプルに対するモデルの予測値です

トレーニングセットデータの場合、エラーが小さいほどモデルが優れています。特定のトレーニングデータセットの場合、値は既知であるため、式2の場合はパラメータwになります。関数。

要約すると、モデルのトレーニングは、実際には、式2の値が最小になるように適切なwを取得することです。最小値を取ることは数学的な最適化の問題になり、E(w)は最適化の目的であり、これは私たちの目的関数です。

 

4つの勾配降下最適化アルゴリズム

数学を学ぶとき、私たちは関数の極値を見つけます。y = f(x)の極値はその導関数が計算されるショップです。したがって、方程式を解くことにより、関数の極値を得ることができます

コンピューターの場合、独自の計算によって極端なポイントを見つけます。次のように:

        まず、変化点がx0点であると仮定して、点をランダムに選択します。次に、各反復でxがx1、x2、x3、...に変化します。何度も反復した後、関数の最小点に到達します。

     xの値を変更するたびに、関数の最小値の方向に進む必要あり、関数y = f(x)の勾配の反対方向xを変更する必要があります。 勾配:関数値が最も速く上昇する方向を指すベクトルです。したがって、勾配の反対方向は、関数値が最も速く低下する方向です。したがって、勾配の反対方向にxの値を変更するたびに、関数の最小値に移動できます。最小点ではなく最小値に近い理由は、各移動のステップ長が適切ではないためです。最後の反復がはるかに進んで、最小点を直接通過した可能性があります。ステップサイズの選択:選択が小さい場合は、最小値の近くに到達するまで何度も繰り返されます。選択範囲が大きい場合は、最小値をはるかに超えて、適切なポイントに収束できない可能性があります。

勾配降下アルゴリズムが与えられた場合:

   

 勾配演算子        :f(x)の勾配を参照     ステップサイズ(学習率)

上記の対応する目的関数(式2)は、次のように書き直すことができます。

勾配降下アルゴリズムは、次のように書き直すことができます。

同時に、最大値が得られた場合、勾配上昇アルゴリズムを使用することができ、そのパラメーター変更規則は次のとおりです。

このとき、線形ユニットのパラメータルールを取得して置換する必要があります。

得られた目的関数の勾配は次のとおりです。

最終線形ユニットのパラメーター変更規則は次のとおりです。

この時点で、この関数を使用して、線形ユニットをトレーニングするためのコードを記述できます。

各サンプルにM個の特徴がある場合、上記の式のxとwはすべてM + 1次元のベクトルであることに注意してください(常に1である仮想特徴x0を追加したため、前のコンテンツを参照してください)。そして、yはスカラーです。数学表記で表現された、つまり

つまり、wとxはM + 1次元の列ベクトルであり、式3は次のように記述できます。  

五、目的関数の導出

数学を学んだ仲間、知っているが知らない仲間、私はここで、関数の勾配の定義は各変数に関する部分的な導関数であることをお伝えします

次のように:

11を解きます。まず、導関数の合計が合計の導関数に等しいので(詳細は言うまでもなく、Baiduは自分で使い果たします~~)、最初に合計記号を入力します。

内部の導関数は次のように計算され、追加されます。

次のように派生物を見つけます。

上記から、yはwとは関係のない定数であり、導出連続規則(複合関数の導出)によって取得されることがわかります。

上記の式の右辺にある2つの部分導関数を計算します

代入、合計の部分導関数は次のとおりです。

mamaya ~~ついに終わりました、leiskr。

6.確率的勾配降下(SGD)

           第4四半期の式3がモデル(DGDをトレーニングするために、各反復Wで、バッチ勾配降下バッチ勾配降下と呼ばれるすべてのサンプルデータをトラバースする場合

ただし、サンプルが特に大きく、データ量が数百万から数億に達する場合は、SDGアルゴリズムがよく使用されます。SGDアルゴリズムでは、wの更新の反復ごとに1つのサンプルのみが計算されます。このように、数百万のサンプルを含むトレーニングデータの場合、1回のトラバーサルを完了すると、数百万回更新され、効率が大幅に向上します。サンプルのノイズとランダム性のため、wの各更新は必ずしもEを減らす方向にあるとは限りません。ただし、ある程度のランダム性はありますが、一般的にはEを小さくする方向に更新が多く進行するため、最終的には最小値近くまで収束する可能性があります。次の図は、SGDとBGDの違いを示しています。

上図に示すように、楕円は関数値の輪郭を表し、楕円の中心は関数の最小点です。赤はBGDの近似曲線、紫はSGDの近似曲線です。、BGDが最低点に向かって進んでいることがわかります。SDGは大きく変動しますが、最終的には最低点に近づいています。

      最後に、SGDは効率的であるだけでなく、ランダム性が良い場合があることに注意してください。今日の目的関数は「凸関数」であり、グローバルに一意の最小値は勾配の反対方向に沿って見つけることができます。ただし、非凸関数の場合、多くの極小値があります。ランダム性は、いくつかのひどい極小値を回避して、より良いモデルを取得するのに役立ちます。

セブン、リニアユニットを実現

以前のパーセプトロンモデルを比較します。

上の図を比較すると、異なるアクティベーション関数fを除いて、2つのモデルとトレーニングルールは同じであることがわかります(上の表では、線形ユニットの最適化アルゴリズムはSDGアルゴリズムです)。したがって、現時点では、パーセプトロンのアクティブ化機能を置き換えるだけで済みます。

線形ユニットは、前のセクションからPerceptronを継承することによって実現されます。

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2019/4/29 15:23
# @Author  : xhh
# @Desc    :  
# @File    : test_linearModel.py
# @Software: PyCharm
from test_perceptorn import Perceptron


# 定义激活函数
f = lambda x: x

class LinearUnit(Perceptron):
    def __init__(self, input_num):
        """
        初始化线性单元,设置输入参数的个数
        :param input_num:
        """
        Perceptron.__init__(self, input_num,f)

テストするデータをシミュレートします。

def get_training_dataset():
    """
    假设5个人的收入数据
    :return:
    """
    # 构建训练数据
    # 输入向量列表,每一项都是工作年限
    input_vecs = [[5],[3],[8],[1.4],[10.1]]
    # 期望的输出列表,月薪,注意要与输入一一对应
    labels = [5500, 2300, 7600,1800,11400]
    return input_vecs, labels

def train_linear_unit():
    """
    使用数据训练线性单元
    :return:
    """
    # 创建感知器,输入参数的特征为1(工作年限)
    lu = LinearUnit(1)

    # 训练,迭代10轮,学习速率为0.01
    input_vecs, labels = get_training_dataset()
    lu.train(input_vecs, labels, 10, 0.01)

    # 返回训练好的线性单元
    return lu

def plot(linear_unit):
    import matplotlib.pyplot as plt
    input_vecs, labels = get_training_dataset()
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(map(lambda x:x[0], input_vecs), labels)
    weights = linear_unit.weight
    bias = linear_unit.bias
    x = range(0, 12, 1)
    y = map(lambda x:weights[0] * x + bias, x)
    ax.plot(x, y)
    plt.show()


if __name__ == '__main__':
    """
    训练线性单元
    """
    linear_unit = train_linear_unit()
    # 打印训练获得的权重
    print(linear_unit)
    # 测试
    print('工作3.6年,月收入 = %.2f'% linear_unit.predict([3.4]))
    print('工作10年,月收入 = %.2f'% linear_unit.predict([10]))
    print('工作6.3年,月收入 = %.2f'% linear_unit.predict([6.3]))
    plot(linear_unit)

結果は次のとおりです。

適合直線は次のとおりです。

 総括する:

上で書かれたことから、機械学習アルゴリズムは実際には2つの部分しかないと結論付けられます。

 1.モデル  は、入力フィーチャxからの出力yの関数h(x)を予測します。

  2.目的関数目的関数  の最小(最大)値に対応するパラメーター値は、モデルのパラメーターの最適値です。ただし、通常、目的関数のローカル最小(最大)値しか取得できないためモデルパラメーターのローカル最適値しか取得できません

  3.次に、最適化アルゴリズム使用して、目的関数の最小(最大)値を見つけます。[ランダム]勾配{減少|上昇}アルゴリズムは最適化アルゴリズムです。目的関数の場合、最適化アルゴリズムが異なれば、トレーニングルールも異なります

 

参考資料:

  1. Tom M. Mitchell、「Machine Learning」、Zeng Huajun et al。、China Machinery IndustryPressによる翻訳

https://www.zybuluo.com/hanbingtao/note/448086

私の友人と私の公式アカウントに注意を払うことができます~~~ここに私の友人と私が時々更新するいくつかのpython技術情報があります!メッセージを残して技術的な問題について話し合うこともできます。サポートして注目していただければ幸いです。ありがとうございます~~

 

おすすめ

転載: blog.csdn.net/weixin_39121325/article/details/89638932