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)」によるオリジナル翻訳です]

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

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

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

ブログ    

推薦する

RangePerception: Range View3D 検出への新しいアプローチ!

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

人工知能に関する詳細な調査:AIツールを使ったことがある人は思っているほど考えていない

6月27日、有名なテクノロジーメディアVergeは調査会社と協力し、人工知能の使用状況、期待、懸念を...

世界中の経営幹部の93%がAIに期待を抱いているが、65%はまだその恩恵を受けていないと答えている。

[[280194]]最近の調査、研究、予測、および AI アプリケーションの進捗状況と状況に関する...

データから洞察まで、IBMは企業の人工知能への取り組みを加速します

[51CTO.com からのオリジナル記事] インテリジェンス + の時代では、データは企業の中核資...

...

インベントリ | 知らないかもしれないディープラーニングの応用事例 8 つ

ディープラーニングは、多層人工ニューラル ネットワークを使用してコンピューター ビジョンから自然言語...

5分間の技術講演 | GET3D生成モデルの簡単な分析

パート01●序文近年、MidjourneyやStable Diffusionに代表されるAI画像生成...

RSAは過去2世紀で最も重要なアルゴリズムの1つです

Diffie-Hellman暗号化アルゴリズムの欠点[[225219]]前回の記事では、Diffie...

ディープラーニングを超える新しいAIプログラミング言語Genについて1つの記事で学びましょう

AI の急速な発展は多くの人々の学習意欲をかき立てていますが、初心者にとっては大量の手動プログラミン...

Quora は機械学習をどのように活用していますか?

[[202181]] 2015年、同社のエンジニアリング担当副社長であるXavier Amatri...

...

海外メディア:ロボットは人間の生活を変え、雇用や結婚のパターンに影響を与える

[[442070]]レファレンス・ニュース・ネットワークは12月26日、ドイツのフランクフルター・ア...

10年後の市場規模は1.3兆ドル。「モデル電源時代」到来

半年以上にわたる大規模なモデル嵐の後、AIGC 市場には新たな変化が起こり始めました。クールな技術デ...

ジェネレーティブ AI と自動化: 未来のデータ センターを加速

自動化と生成型人工知能 (GenAI) の時代において、「データセンター」の本当の意味を再考する時が...