ゼファーネットのロゴ

画像認識と自然言語処理のための転移学習

日付:

この記事のパート1を読む機会があれば、Transfer Learningは、あるタスクで使用されたモデルから得られた知識の応用を別のタスクの基礎として再利用できる機械学習方法であることを思い出してください。

機会がなく、転移学習について十分に理解していない場合は、この記事をよりよく理解するのに役立つことを読んでください。 

画像認識

 
それでは、最初に画像認識とは何かを見てみましょう。 画像認識は、画像またはビデオ内のオブジェクトまたは機能を検出および分析できるようにするために、コンピューター技術に割り当てられたタスクです。 これは、パターンを認識するように設計されているため、ディープニューラルネットワークが魔法をかける主要な領域です。 

ニューラルネットワークが画像の理解をどのように分析して把握するかを知りたい場合は、こちらをご覧ください こちら。 これは、低レベルのレイヤーが低レベルの機能の学習にどのように集中しているか、および高レベルのレイヤーが高レベルの機能の学習にどのように適応するかを示しています。

この記事のパート1では、猫と犬のネットワークのトレーニングについて漠然と話しましたが、それについてもっと話しましょう。 人間の脳は、オブジェクト間の違いを認識して区別することができます。 画像認識は、人間の脳と同様の機能を持ち、画像内のオブジェクト間の違いを識別および検出できるようにすることも目的としています。 

画像認識で使用されるアルゴリズムは、入力画像を受け取り、画像に含まれるものを出力する画像分類器です。 このアルゴリズムは、検出したオブジェクト間の違いを学習するようにトレーニングする必要があります。 画像分類器が猫と犬を識別するために、画像分類器は、猫と犬を含まない画像とともに、猫と犬の何千もの画像で訓練される必要があります。 したがって、この画像分類器から取得したデータを実装して、他のタスクでの猫と犬の検出に使用できます。 

では、事前にトレーニングされた画像モデルはどこにありますか?

 
事前にトレーニングされたモデルがたくさんあるので、問題を解決するための適切なモデルを見つけるには、少し調査が必要です。 私はあなたのために少し研究をするつもりです。 私はについて話すことから始めます ケラス。 Kerasは、転移学習、特徴抽出、微調整、および予測に使用できる、事前にトレーニングされた幅広いモデルを提供します。 あなたはそれらのリストを見つけることができます こちら.

Kerasアプリケーションの例はXceptionアーキテクチャであり、これについてはさらに簡単に説明しました。 これは、ImageNetでXceptionを初期化する方法です。

tf.keras.applications.Xception(include_top = True、weights = "imagenet"、input_tensor = None、input_shape = None、pooling = None、classes = 1000、classifier_activation = "softmax"、)

Kerasについて話すときは、TensorFlowHubを忘れないでください。 TensorFlowは、Googleが開発したオープンソースライブラリであり、機械学習とディープラーニングをサポートしています。 TensorFlow Hubには、画像、テキスト、ビデオ、オーディオの分類など、事前にトレーニングされた、すぐにデプロイできるさまざまなモデルがあります。 

シーケンシャルモデルは、レイヤーのプレーンスタックに使用するのに適しています。これには、各レイヤーにXNUMXつの入力テンソルとXNUMXつの出力テンソルがある場合が必要です。 

例1:

model = tf.keras.Sequential([embed、tf.keras.layers.Dense(16、activation = "relu")、tf.keras.layers.Dense(1、activation = "sigmoid")、])

例2:

m = tf.keras.Sequential([hub.KerasLayer( "https://tfhub.dev/google/imagenet/inception_v1/classification/5")])m.build([None、224、224、3])#バッチ入力形状。

ディープラーニングでは、いくつかの戦略により、事前にトレーニングされたモデルから最大の利益を得ることができます。 
 
 

特徴抽出

 
私が話す最初の戦略は特徴抽出です。 基本的に、事前にトレーニングされたモデルを固定の特徴抽出器として実行し、目的の特徴を使用して新しい分類器をトレーニングします。 モデルの入力層に近い畳み込み層は、画像認識のエッジや線などの低レベルの特徴を学習します。 レイヤーが進むにつれて、レイヤーはより複雑な機能を学習し始め、最終的には出力に近い特定の機能を解釈できるようになります。これは、目前の分類タスクです。 モデルの一部を使用してタスクを分類することにより、さまざまなレイヤーレベルを個別の特徴抽出統合として使用できます。 

たとえば、タスクが事前トレーニング済みモデルが行う画像内のオブジェクトの分類と異なる場合、事前トレーニング済みモデルがいくつかのレイヤーを通過した後に出力を使用する方が適切です。 したがって、新しいモデルへの入力が新しい分類器に渡され、目前のタスクを解決できるようになるために不可欠な機能を取得すると、目的のレイヤーの新しい出力が供給されます。 

全体として、特徴抽出を使用して事前にトレーニングされたモデルを活用して、タスクの解決に役立つ機能を決定するという考え方ですが、ネットワークの出力はタスク固有であるため、使用しません。 次に、タスクに固有のモデルの最後の部分を作成する必要があります。 

微調整

 
XNUMX番目の戦略は、微調整、つまり私がネットワーク手術と呼んでいるものです。 上記の微調整について説明しました。微調整は、パフォーマンスをさらに向上させるために目的の出力を取得するために、プロセスに「微調整」を行うことに基づいています。 微調整は、特徴抽出へのさらなるステップとしても見られます。 微調整では、特定のレイヤーをフリーズし、一部を選択的に再トレーニングして精度を向上させ、より低い学習率でより高いパフォーマンスを実現し、必要なトレーニング時間を短縮します。 

基本モデルから効率的な特徴表現を取得できるようにしたい場合は、微調整が不可欠です。これにより、目前のタスクにより対応できるようになります。 

例:Kerasで事前にトレーニングされた画像モデルを使用する方法

 
それでは、例を見てみましょう。 猫と犬についてたくさん話してきたので、それらの画像認識の例を見てみましょう。 

データをロードする

 
したがって、最初に、必要なライブラリをインポートしてデータをロードすることを確認しましょう。

import numpy as np import tensorflow as tf from tensorflow import keras import tensorflow_datasets as tfds

トレーニングとテスト用にサンプルサイズを印刷して、作業しているデータの量を理解し、画像をざっと見て、作業しているデータを確認できるようにすることをお勧めします。 

画像認識と自然言語処理のための転移学習


 

画像のサイズはさまざまであるため、ニューラルネットワークの一貫した入力として、固定画像サイズに標準化することをお勧めします。 

データ前処理

 
それでは、データ拡張について見ていきましょう。 小さいデータセットで作業する場合は、水平方向の反転など、トレーニング画像にランダムな変換を適用することをお勧めします。 反転とは、画像を垂直軸または水平軸で回転させることを意味します。 これにより、モデルをトレーニングデータのさまざまな角度や側面に公開し、過剰適合を減らすことができます。 

from tensorflow import keras from tensorflow.keras import layer data_augmentation = keras.Sequential([layers.RandomFlip( "horizo​​ntal")、layers.RandomRotation(0.1)、])

選択したアーキテクチャからbase_modelを作成する(Xception)

 
次のステップはモデルの作成です。 まず、ベースモデルのインスタンス化から始めます。 Xception、および事前にトレーニングされたウェイトをロードします。 この例では、ImageNetを使用しています。 次に、ベースモデルのすべてのレイヤーをフリーズします。 フリーズは、トレーニング中にウェイトが更新されるのを防ぐのに役立ちます。

base_model = keras.applications.Xception(weights = "imagenet"、#ImageNetで事前トレーニングされた重み。input_shape=(150、150、3)、include_top = False、)base_model.trainable = False

最上層をトレーニングする

 
次のステップは、フリーズされたレイヤーの上に新しいレイヤーを作成することです。これにより、古い機能に関する知識が学習され、それを使用して新しいデータセットの予測が決定されます。 これは、転移学習のステップでさらに説明するように有益です。事前トレーニング済みモデルの現在の出力とモデルから必要な出力が異なる可能性が高いため、新しいレイヤーを追加すると、モデル全体が改善されます。 

#上部に新しいモデルを作成するinputs = keras.Input(shape =(150、150、3))x = data_augmentation(inputs)#ランダムなデータ拡張を適用する


 

画像認識と自然言語処理のための転移学習


 

微調整

 
したがって、凍結されたレイヤーを使用してモデルを実行した後、基本モデルを凍結せずにモデルを実行する必要があります。これにより、モデルが本質的に改善され、学習率が低くなります。 過剰適合の量を減らしたいので、この手順をゆっくりと実行して、ベースモデルのフリーズを解除しましょう。

Base_model.trainable = True

次に、モデルを再度コンパイルします。

model.compile(optimizer = keras.optimizers.Adam(1e-5)、#低学習率loss = keras.losses.BinaryCrossentropy(from_logits = True)、metrics = [keras.metrics.BinaryAccuracy()]、)エポック= 10 model.fit(train_ds、epochs = epichs、validation_data = validation_ds)

画像認識と自然言語処理のための転移学習


 

さらに詳しく知りたい場合は、をクリックしてください。 こちら Colabノートブックを表示します。 
 
 

自然言語処理

 
画像分類についてはかなり話しましたが、自然言語処理(NLP)について見ていきましょう。 では、NLPとは何ですか? NLPは、人間ができるのと同じように、音声とテキストを介して人間の言語を検出して理解できるコンピューターの機能です。 

人間の言語には多くのあいまいさが含まれているため、音声とテキストを正確に検出できるソフトウェアを作成することは困難です。 たとえば、皮肉、文法、同音異義語などですが、これらは人間の言語を学ぶ上でのほんのわずかな問題です。 

NLPの例は、音声認識と感情分析です。 NLPのユースケースは、スパム検出のようなものです。 NLPがスパム検出に実装されているとは思わなかったかもしれませんが、実際はそうです。 NLPのテキスト分類には、電子メールをスキャンし、スパムまたはフィッシングの可能性があることを示す言語を検出する機能があります。 これは、悪い文法の乱用、脅威、金融用語の乱用などを分析することによって行われます。 

では、TransferLearningはNLPでどのように機能しますか? ええと、それは基本的に画像認識と同じように機能します。 自然言語モデルのトレーニングは非常に高額になる可能性があり、大量のデータを必要とし、豪華なハードウェアで多くのトレーニング時間を費やします。 しかし、幸いなことに、画像認識と同様に、これらの事前トレーニング済みモデルを無料でダウンロードし、特定のデータセットで機能するように微調整することができます。

これらの事前トレーニング済みモデルはどこにありますか? 

 
Kerasは、画像認識用の事前トレーニング済みモデルを提供するだけでなく、NLP用のアーキテクチャも提供します。 あなたはガンダーを持つことができます こちら

抱き合う顔

 
調べてみましょう 抱き合う顔。 HuggingFaceは、自然言語処理(NLP)のオープンソースプロバイダーであり、ユーザーフレンドリーにするために素晴らしい仕事をしてきました。 

彼らのTransformersライブラリは、テキスト分類や質問応答などのNLPタスクを実行するBERTなどのアーキテクチャを提供するPythonベースのライブラリです。 事前にトレーニングされたモデルに数行のコードをロードするだけで、実験を開始できます。 Transformersの使用を開始するには、Transformersをインストールする必要があります。

以下は、感情分析の使用例です。感情分析は、テキストで表現された意見を識別できる機能です。

! トランスフォーマーからのpipinstallトランスフォーマーimportpipeline classifier = pipe( 'sentiment-analysis')classifier( '転送学習に関する記事が非常に役立つと思います。')

出力:

[{'label': 'POSITIVE'、 'score':0.9968850016593933}]

事前にトレーニングされたモデルを微調整して改善することは、TrainerAPIを使用したHuggingFaceのオプションです。 トランスフォーマーは、事前にトレーニングされたモデルの微調整を支援するトレーナークラスを提供しました。 このステップはデータの処理後に行われ、TrainingArgumentsをインポートする必要があります

トランスフォーマーからTrainingArgumentsをインポートします

HuggingFaceの詳細については、以下をご覧ください。

単語の埋め込み

 
単語の埋め込みはどうですか? あれは何でしょう? 単語の埋め込みは、類似した単語が類似したエンコーディングを持つ表現です。 ドキュメント内の単語を検出し、その単語と他の単語との関係をリンクすることができます。 

この例として、Word2Vecがあります。これは、ベクトルエンコーディングによってテキストを処理するXNUMX層ニューラルネットワークです。 

Word2Vecは、単語表現を学習するためにXNUMXつの方法を使用しました。

  1. 継続的な言葉の袋 –は、ソースワード(隣接するワード)に基づいてターゲットワード(ミドルワード)を予測しようとするモデルアーキテクチャです。 コンテキスト内の単語の順序は必ずしも重要ではありません。アーキテクチャが「bag-of-words」と呼ばれる理由
  2. 連続スキップグラム –は、基本的にBag-of-Wordsの反対のモデルアーキテクチャです。 ターゲット単語(中間単語)を指定して、ソース単語(隣接単語)を予測しようとします

特徴抽出は、Word Embeddingで使用される戦略であり、作業しようとしているNLPタスクのタイプに役立つ特徴表現を検出して生成します。 特徴抽出では、パーツ(文または単語)が、すべての単語に与えられたすべての単語の表現を持つ行列に抽出されます。 重みは変更されず、モデルの最上層のみが使用されます。 

ただし、微調整により、事前にトレーニングされたモデルの重みが微調整されます。これは、重みが変更され、かつて学習されたものがメモリに存在しないため、調整フェーズで単語が失われる可能性があるため、不利益になる可能性があります。 。 これは「壊滅的な干渉」として知られています。 

例:Kerasで事前にトレーニングされたNLPモデルを使用する方法

 
単語の埋め込みについて話していたので、例を見てみましょう。 単語の埋め込みとは何かを簡単に要約すると、これは、類似した単語が類似したエンコーディングを持つ表現です。 ドキュメント内の単語を検出し、その単語と他の単語との関係をリンクすることができます。 それでは、これがどのように機能するかを見てみましょう。

データをロードする

 
この例では、映画のレビューを見ていきます。 上記の例を覚えているなら、感情分析を使用して、それがどれほどポジティブであるかを決定する出力を生成しました。 これらの映画レビューでは、ポジティブとネガティブがあるため、これは二項分類です。 

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"データセット= tf.keras.utils.get_file( "aclImdb_v1.tar.gz"、url、untar = True、 cache_dir = '。'、cache_subdir = '')dataset_dir = os.path.join(os.path.dirname(dataset)、 'aclImdb')os.listdir(dataset_dir)

下の画像で区別がわかります。0は負で、1は正です。

画像認識と自然言語処理のための転移学習


 

次に、KerasのEmbedding Layerを使用して、正の整数を固定サイズの密なベクトルに変換しました。 埋め込みの重みはランダムに初期化され、バックプロパゲーション中に調整されます。 知識が学習されると、単語の埋め込みは、学習した単語と以前に学習した単語の類似性をエンコードします。

#1,000語の語彙を5次元に埋め込みます。 embedding_layer = tf.keras.layers.Embedding(1000、5)

テキストの前処理

 
テキストの前処理段階で、映画のレビューをベクトル化するために、必要なパラメーターを使用してTextVectorizationレイヤーを初期化します。 テキストベクトル化レイヤーは、映画レビューの文字列を整数に分割してマッピングするのに役立ちます。 

#分割するテキストベクトル化レイヤー、および文字列を整数にマップします。 vectorize_layer = TextVectorization(standardize = custom_standardization、max_tokens = vocab_size、output_mode = 'int'、output_sequence_length = sequence_length)

モデルを作成する

 
上記の前処理からのvectorize_layerは、文字列を語彙インデックスに変換したため、モデルの最初のレイヤーとして実装されます。 変換された文字列を埋め込みレイヤーにフィードします。 

次に、埋め込みレイヤーはこれらの語彙インデックスを取得し、各単語インデックスのベクトルをスキャンします。ここで、モデルのトレーニング中に学習します。 

model = Sequential([vectorize_layer、Embedding(vocab_size、embedding_dim、name = "embedding")、GlobalAveragePooling1D()、Dense(16、activation = 'relu')、Dense(1)])

この例では、 テンソルボード、これは、機械学習ワークフローを示す視覚化を提供するためのツールです。たとえば、損失や精度などです。 

モデルをコンパイルする

 
AdamオプティマイザーとBinaryCrossentropy損失を使用してモデルをコンパイルします。

model.compile(optimizer = 'adam'、loss = tf.keras.losses.BinaryCrossentropy(from_logits = True)、metrics = ['accuracy'])

画像認識と自然言語処理のための転移学習


 

モデルのメトリックを視覚化するTensorBoardについて説明しましたが、これは以下で確認できます。

画像認識と自然言語処理のための転移学習


 

事前にトレーニングされた単語埋め込みモデルを使用して、NLPモデルをトレーニングおよびテストする方法を見てきました。 Colabノートブックをさらに詳しく知りたい場合は、そうすることができます。 ページ をご覧ください 
 
 

転移学習のベストプラクティスは何ですか?

  1. 事前トレーニング済みモデル –これらの事前トレーニング済みのオープンソースモデルを利用して、さまざまな分野をカバーするため、ターゲットタスクを解決するのに役立ちます。 モデルを最初から作成する時間を大幅に節約できます。
  2. ソースモデル –ソースタスクとターゲットタスクの両方と互換性のあるモデルを見つけることが重要です。 ソースモデルがターゲットから離れすぎていて、知識がほとんど転送されない場合は、ターゲットモデルの達成に時間がかかるため、時間がかかります。 
  3. オーバーフィット –ソースタスクとターゲットタスクが類似しすぎている、データサンプルが少ないターゲットタスクでは、過剰適合につながる可能性があります。 レイヤーをフリーズし、コースモデルの学習率を調整すると、モデルの過剰適合を減らすのに役立ちます。 

この記事が、機械学習の種類を通じて転移学習を実装する方法についての理解を深めてくれることを願っています。 ぜひお試しください。

 
 
ニシャ・アリア データサイエンティストであり、フリーランスのテクニカルライターです。 彼女は特に、データサイエンスのキャリアに関するアドバイスやチュートリアル、およびデータサイエンスに関する理論に基づく知識の提供に関心を持っています。 彼女はまた、人工知能が人間の寿命の長寿に役立つ/できるさまざまな方法を探求したいと考えています。 他の人を導くのを助けながら、彼女の技術知識とライティングスキルを広げることを求めている熱心な学習者。

出典:https://www.kdnuggets.com/2022/01/transfer-learning-image-recognition-natural-language-processing.html

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?