TensorFlow 機械学習の初心者向けガイド: 線形回帰を実装するには?

TensorFlow 機械学習の初心者向けガイド: 線形回帰を実装するには?

TensorFlow 入門記事: 初心者でも理解できる TensorFlow 入門

小学校で受けた理科の授業を覚えていますか? それほど昔のことではないかもしれません。もしかしたら、あなたは今小学生かもしれませんが、すでに機械学習への道を歩み始めているかもしれません。生物学的、化学的、物理的など、アプローチに関係なく、データを分析するための一般的な手法は、データをプロットして、1 つの変数の変化が他の変数にどのように影響するかを確認することです。

降雨頻度と作物収穫量の相関関係をプロットしたいとします。降雨量が増えると農業生産性も上がることがわかります。このデータに線を当てはめると、さまざまな降雨条件下での農業生産性を予測できます。複数のデータ ポイントから暗黙的な機能関係を発見できれば、この学習した関数を使用して未知のデータの値を予測できます。

回帰アルゴリズムは、データを要約する曲線を最もよく適合させる方法を検討します。これは、教師あり学習アルゴリズムの中で最も強力かつ最も研究されているクラスです。回帰では、データを生成した可能性のある曲線を見つけることでデータを理解しようとします。これを行うことで、特定のデータ ポイントが分散している理由を説明できます。最適な曲線は、データ セットがどのように生成されたかを説明するモデルを提供します。

この記事では、回帰を使用して現実世界の問題を解決する方法を学びます。ご覧のとおり、最も強力な予測ツールが必要な場合は、TensorFlow ツールが最適な選択です。

基本概念

ツールがあれば、すべては簡単に行えます。最初の重要な機械学習ツールである回帰を実演し、正確な数式を示します。まず、回帰分析で学ぶスキルの多くは、遭遇する可能性のある他の種類の問題を解決するのに役立ちます。この記事を読んだ後、回帰は機械学習ツールボックスの強力なツールになります。

人々がビール 1 本あたりにいくら費やしたかを記録したデータがあるとします。 A さんは 1 本に 2 ドル、B さんは 2 本に 4 ドル、C さんは 3 本に 6 ドルを費やしました。ビールのボトル数が総コストにどのように影響するかを説明する方程式を見つけたいです。たとえば、ビール 1 本あたりの価格が 2 ドルの場合、線形方程式 y=2x は特定の数のビールの購入コストを表します。

線がいくつかのデータ ポイントによく適合する場合、線形モデルのパフォーマンスが良好であると言えます。実際、傾斜値 2 を選択する代わりに、多くの可能な傾斜を試すことができます。傾きがパラメータであり、結果として得られる方程式がモデルです。機械学習の用語では、学習したモデルのパラメータから最適曲線の方程式が導出されます。

別の例として、方程式 y=3x も直線ですが、傾きが急になります。この係数 (w と呼ばれる) を任意の実数に置き換えても、方程式は直線のままです: y=wx。図 1 は、パラメータ w を変更するとモデルにどのような影響が及ぶかを示しています。このようにして生成されたすべての方程式の集合をM={y=wx|w∈ℝ}と表します。

この集合は、「y=wx を満たすすべての方程式(w は実数)」を表します。

図1.

図1:パラメータwの異なる値は異なる線形方程式を表します。これらすべての線形方程式の集合が線形モデル M を構成します。

M はすべての可能なモデルの集合です。 w の値が選択されるたびに、候補モデル M(w) が生成されます: y=wx。 TensorFlow で記述された回帰アルゴリズムは、より良いモデル パラメーター w に反復的に収束します。最適パラメータを w* と呼び、最適な式を M(w*): y=w*x とします。

基本的に、回帰アルゴリズムは、入力を出力にマッピングする関数 (f と呼びます) を設計しようとします。関数の定義域は、実数 ℝ の集合を範囲とする実数 ℝd のベクトルです。関数への入力は連続的または離散的になります。ただし、図 2 に示すように、出力は連続的である必要があります。

図2.

図 2:回帰アルゴリズムは連続的な出力を生成するように設計されています。入力は離散的でも連続的でもかまいません。この区別は重要です。離散出力値は分類問題に適しているためです。これについては次の章で説明します。

ちなみに、回帰の予測値は連続出力ですが、これがやり過ぎになることもあります。場合によっては、0 や 1 などの離散出力を予測したいだけかもしれません (0 から 1 の間の値は生成されません)。分類は、この種のタスクに適した手法です。

与えられたデータ(つまり、入力/出力データのペア)と一致する関数 f を見つけたいのです。残念ながら、可能な機能の数は無限であるため、1つずつ試すことはできません。選択肢が多すぎるのは、たいていの場合、良いことではありません。処理するすべての機能の範囲を絞り込む必要があります。たとえば、データに適合する直線(曲線なし)のみを探している場合、検索ははるかに簡単になります。

  • 演習 1: 10 個の整数を 10 個の整数にマッピングする関数はいくつありますか? たとえば、入力変数が 0 から 9 の数字で、出力が 0 から 9 の数字である関数 f(x) があるとします。たとえば、f(0)=0、f(1)=1 など、入力の恒等関数をシミュレートします。他にはいくつの機能がありますか?
  • 答え: 10^10=10000000000

回帰アルゴリズムが実行可能かどうかを判断するにはどうすればよいでしょうか?

不動産会社に不動産市場予測アルゴリズムを販売しているとします。このアルゴリズムは、寝室の数やアパートの広さなど、いくつかの住宅属性に基づいて不動産の価格を予測することができます。不動産会社は住宅価格情報を使って簡単に何百万ドルも儲けることができるが、購入する前にそのアルゴリズムが機能するという証拠が必要だ。

トレーニングされたアルゴリズムの成功を測定するための重要な指標が 2 つあります。分散とバイアスです。

分散は、トレーニング セットに対する予測値の感度 (変動) を反映します。理想的には、トレーニング セットの選択が結果にほとんど影響を与えないようにします。つまり、分散値が小さいことが望ましいということです。

バイアスは、トレーニング セット内の仮説の信頼度レベルを表します。仮定が多すぎると一般化が難しくなる可能性があるため、バイアス値を小さくすることも必要です。

一方、モデルが柔軟すぎると、有用なパターンを発見する代わりに、モデルがトレーニング セットを誤って記憶してしまう可能性があります。エラーを発生することなくデータセット内のすべてのポイントを通過する曲線関数を想像することができます。このような状況が発生すると、学習アルゴリズムがトレーニング データに過剰適合していると言えます。この場合、最適な曲線はトレーニング データに非常によく適合しますが、テスト セットで評価すると、結果が非​​常に悪くなる可能性があります (図 3 を参照)。

図3

図 3: 理想的には、最適な曲線はトレーニング セットとテスト セットの両方に適用されます。ただし、テスト セットのパフォーマンスがトレーニング セットよりも優れている場合は、モデルの適合不足の可能性があります。逆に、テスト セットではパフォーマンスが低いが、トレーニング セットではパフォーマンスが高い場合、モデルは過剰適合していることになります。

一方、柔軟性の低いモデルは、未知のテスト データに対してはより適切に一般化される可能性がありますが、トレーニング セットではパフォーマンスが低下します。この状況はアンダーフィッティングと呼ばれます。過度に柔軟なモデルは分散が高くバイアスが低くなりますが、柔軟性のないモデルは分散が低くバイアスが高くなります。理想的には、分散誤差とバイアス誤差が低いモデルが望まれます。このようにして、未知のデータに一般化し、データ内の規則性を捉えることができます。例については図 4 を参照してください。

図 4. データのアンダーフィッティングとオーバーフィッティングの例。

具体的には、モデルの分散は応答がどれだけ変動するかを測る尺度であり、バイアスは応答が実際のデータとどれだけ異なるかを表します。最終的には、モデルが正確(バイアスが低い)かつ再現性(分散が低い)を持つことが望まれます。

  • 演習 2: モデルが M(w): y=wx であるとします。重み w の値が 0 から 9 までの整数でなければならない場合、可能な関数はいくつありますか?
  • 答え: ケースは 10 個だけあります。つまり、{y=0、y=x、y=2x、...、y=9x} です。

機械学習モデルを評価するために、データセットをトレーニング セットとテスト セットの 2 つのセットに分割します。トレーニング セットはモデルの学習に使用され、テスト セットはパフォーマンスの評価に使用されます。可能な重みパラメータは多数ありますが、私たちの目標はデータに最も適合する重みを見つけることです。 「最適な適合」を測定する方法は、コスト関数を定義することです。

線形回帰

シミュレートされたデータを使用して線形回帰を実行してみましょう。 regression.py という名前の Python ソース ファイルを作成し、リスト 1 に従ってデータを初期化します。このコードは図 5 のような出力を生成します。

リスト1: 生の入力を視覚化する

  1. numpy を np としてインポート //#A matplotlib.pyplot を plt としてインポート //#B
  2.  
  3. x_train = np .linspace(-1, 1, 101) //#C
  4. y_train = 2 * x_train + np.random.randn(*x_train.shape) * 0.33 //#D
  5.  
  6. plt.scatter(x_train, y_train) //#E
  7. plt.show() //#E
  • # A: NumPyパッケージをインポートして初期の生データを生成する
  • # B: matplotlib を使用してデータを視覚化する
  • # C: 入力値は -1 から 1 までの 101 個の均等間隔の数字です
  • # D: 入力値に比例し、ノイズを加えた出力値を生成する
  • # E: matplotlib の関数を使用して散布図を描画する

図 5. 散布図 y=x+ε、ここで ε はノイズです。

これで、これらのデータ ポイントを使用して直線を当てはめることができます。 TensorFlow では、試す候補パラメータごとに少なくともスコアを割り当てる必要があります。このスコアはコスト関数と呼ばれることがよくあります。コスト関数の値が高くなるほど、モデル パラメータは悪くなります。たとえば、最適な直線が y=2x の場合、パラメータ値 2.01 を選択するとコスト関数値は低くなりますが、パラメータ値 -1 を選択するとコスト関数値は高くなります。

この時点で、コスト関数の値を最小化することが問題になります。図 6 に示すように、TensorFlow はパラメータを効果的に更新し、最終的に可能な限り最適な値に到達しようとします。すべてのパラメータを更新する各ステップはエポックと呼ばれます。

図6

図 6: パラメータ w に関係なく、最適なコスト関数の値は最小になります。コスト関数は、真の値とモデル応答間の誤差のノルムとして定義されます (ノルムは、2 乗、絶対値、3 乗などになります)。最後に、モデルの関数によって応答値が計算されます。

この場合、コスト関数はエラーの合計として定義されます。予測xの誤差は通常、実際の値f(x)と予測値M(w, x)の差の二乗によって計算されます。したがって、コスト関数値は、図 7 に示すように、実際の値と予測値の差の二乗の合計になります。

図 7. コスト関数値は、モデル応答と真の値の間の点ごとの差のノルムです。

リスト 1 のコードをリスト 2 のように更新します。このコードはコスト関数を定義し、TensorFlow に (勾配降下法) 最適化を実行して最適なモデル パラメータを見つけるように要求します。

リスト2: 線形回帰を解く

  1. import tensorflow as tf //#A import numpy as np //#A import matplotlib.pyplot as plt //#A
  2.  
  3. 学習率= 0.01 //#B
  4. トレーニングエポック= 100 //#B
  5.  
  6. x_train = np .linspace(-1, 1, 101) //#C
  7. y_train = 2 * x_train + np.random.randn(*x_train.shape) * 0.33 //#C
  8.  
  9. X = tf .placeholder("float") //#D
  10. Y = tf .placeholder("float") //#Ddef model(X, w): //#E return tf.multiply(X, w)
  11.  
  12. w = tf .Variable(0.0, name = "weights" ) //#F
  13.  
  14. y_model = model(X, w) //#G
  15. コスト= tf .square(Y-y_model) //#G
  16.  
  17. train_op = tf .train.GradientDescentOptimizer(learning_rate).minimize(コスト) //#H
  18.  
  19. sess = tf .Session() //#I
  20. init = tf .global_variables_initializer() //#I
  21. sess.run(init) //#Ifor epoch in range(training_epochs): //#J for (x, y) in zip(x_train, y_train): //#K
  22. sess.run(train_op, feed_dict ={X: x, Y: y}) //#L
  23.  
  24. w_val = sess .run(w) //#M
  25.  
  26. sess.close() //#N
  27. plt.scatter(x_train, y_train) //#O
  28. y_learned = x_train *w_val //#P
  29. plt.plot(x_train, y_learned, 'r') //#P
  30. plt.show() //#P
  • #A: 学習アルゴリズム用のTensorFlowパッケージをロードし、初期データを設定するNumPyパッケージをロードし、データを視覚化するためのmatplotlibパッケージをロードします。
  • #B: 学習アルゴリズムで使用されるハイパーパラメータと呼ばれる定数を定義する
  • #C: 線形シミュレーションデータを初期化する
  • #D: 入力ノードと出力ノードをプレースホルダーとして設定し、実際の値はx_trainとy_trainに渡されます
  • #E: モデルをy=w*xとして定義する
  • #F: 重み変数を設定する
  • #G: コスト関数を定義する
  • #H: 学習アルゴリズムの各反復で呼び出される操作を定義します
  • #I: セッションを設定し、すべての変数を初期化する
  • #J: データセットを複数回ループする
  • #K: データセット内の各データをループする
  • #L: コスト関数を最小化するようにモデルパラメータを更新します
  • #M: 最終パラメータ値を取得する
  • #N: セッションを閉じる
  • #O: 元のデータをプロットする
  • #P: 最もフィットする線を描く

TensorFlow を使用して線形回帰を解決しました。おめでとうございます。さらに、回帰分析における他の問題を解決するには、リスト 2 にわずかな変更を加えるだけで済みます。図 8 に示すように、プロセス全体には TensorFlow を使用してモデル パラメータを更新することが含まれます。

図 8. 学習アルゴリズムは、与えられたコスト関数を最小化するためにモデルのパラメータを更新します。

元記事: https://machinelearning.technicacuriosa.com/2017/04/22/machine-learning-with-tensorflow/

[この記事は、51CTOコラムニストのMachine Heart、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  ディープラーニングの悪循環は驚くべき結果をもたらすだろう

>>:  ディープラーニングを使用して映画を推奨するにはどうすればよいでしょうか?独自の推奨システムを作成する方法を教えます!

ブログ    
ブログ    

推薦する

オープンソースの Gemma モデル: Google の言語の奇跡。命令チューニング、低ランク適応、Switch Transformer を使用して小さなモデルで遊ぶことができます。

言語は人間にとって最も重要なコミュニケーションツールであり、人工知能の分野における最も挑戦的な研究対...

...

ガートナー: データサイエンスと機械学習の未来に影響を与える 5 つのトレンド

Gartner, Inc. は、人工知能のデータ需要を満たすために急速に進化している分野であるデータ...

...

Ma Yiチームの新作!大規模なマルチモーダルモデルを微調整すると、「壊滅的な忘却」につながり、パフォーマンスが大幅に低下する可能性があります。

モデルの壊滅的な忘却は現在重要なホットトピックとなっており、GPT-4 でもそれを回避することはでき...

2元で何千枚もの顔写真が買える、AIブラック業界の真実はそれ以上だ!

最近では、「顔スキャン」、つまり顔認識技術を使うことで、解決できることが増えています。買い物の際の「...

すべてのプログラマーが知っておくべきソートアルゴリズムトップ10

導入プログラマーとして、上位 10 のソート アルゴリズムは必須であり、すべての資格のあるプログラマ...

Huggingfaceの機械学習科学者が、ホットなラマ2を特集する分析記事を執筆

Meta は無料の商用バージョンである Llama 2 をリリースし、ネットワーク全体を席巻しました...

Didi、AI技術を活用して交通問題を解決するTraffic Brainをリリース

滴滴出行は1月25日、2018年スマート交通サミットでスマート交通戦略製品「Traffic Brai...

【WOT2018】不正防止、電力、医療分野におけるAI技術の最先端実践

[51CTO.comより引用] 2018年11月30日から12月1日まで、WOT2018グローバル人...

メタ、マイクロソフトなどの大手企業は、AIモデルの訓練に海賊版書籍を使用したとして、数人のアメリカ人作家から訴えられた。

現地時間水曜日のブルームバーグの報道によると、数人のアメリカ人作家が最近ニューヨーク連邦裁判所に訴訟...

人工知能の主要技術分野のレビュー

[[441598]] AI への準備プロセスの多くは組織の変更です。人工知能の利用には、ニューカラー...

ザッカーバーグは7億ドルの配当金を受け取り、Metaの株価は14%急騰、オープンソース計画は成功したのか?

メタの株価は木曜日の時間外取引で14%近く上昇し、史上最高値に達したが、同社は初の配当を発表した。最...

「トランスフォーマー」は5年でクレイジーなCNNに取って代わりました!トランスフォーマーは人工知能を支配するのでしょうか?

AI業界では今や誰もが知る名前となったTransformerが、これほど短期間でなぜこれほど人気を...