TensorFlow を使用してリカレント ニューラル ネットワークを構築、トレーニング、改善する方法

TensorFlow を使用してリカレント ニューラル ネットワークを構築、トレーニング、改善する方法

[[201520]]

Silicon Valley Data Science の研究者らは、リカレントニューラルネットワーク (RNN) が時系列を探索し、音声認識モデルを開発する能力があることを実証しました。現在の AI アプリケーションの多くは再帰型ディープ ニューラル ネットワークに依存しており、RNN は Google (音声検索)、Baidu (DeepSpeech)、Amazon の製品で見ることができます。

しかし、独自の RNN モデルを構築しようとしたとき、音声認識などのタスクにニューラル ネットワークを使用する際に従うべき簡単な前例がほとんどないことがわかりました。見つかる例の中には、Mozilla の DeepSpeech (Baidu の研究に基づき、TensorFlow を使用) のように非常に強力ですが非常に複雑なものや、非常に単純で抽象的なものがあり、実際のデータには適用できません。

この記事では、RNN を使用して音声認識システムをトレーニングする方法について、コード スニペットを含む短いチュートリアルを提供します。このチュートリアルは、さまざまなオープンソース プロジェクトからインスピレーションを得ました。

このプロジェクトの GitHub アドレス: https://github.com/silicon-valley-data-science/RNN-Tutorial

まず、この記事を読み始める前に、RNN についてあまり知らない場合は、Christopher Olah の RNN Long Short-Term Memory Network Overview を読んでみてください。

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

1. 音声認識:音と文字起こし

2010 年まで、最良の音声認識モデルは依然として音声学手法に基づいており、これには通常、スペル、音響、言語モデルなどの個別のコンポーネントが含まれていました。音声認識技術は、過去も現在も、フーリエ変換を使用して音波を周波数と振幅に分解し、次のようなスペクトログラムを生成します。

音声モデルをトレーニングする場合、隠れマルコフモデル (HMM) を使用するには、音声 + テキスト データと、単語と音素の辞書が必要です。 HMM は、シーケンシャル データの生成確率モデルであり、通常はレーベンシュタイン距離を使用して評価されます (レーベンシュタイン距離は編集距離の一種です。2 つの文字列を 1 つの文字列から別の文字列に変換するために必要な編集操作の最小数を指します。実行できる編集操作には、1 つの文字を別の文字に置き換える、文字を挿入する、文字を削除するなどがあります)。

これらのモデルは、音素関連データでトレーニングすることで簡素化したり、精度を高めたりすることができますが、これは面倒な手作業です。このため、大規模なデータセットでは、音声の音素レベルの転写は単語レベルの転写よりも困難です。音声認識ツールとモデルの詳細については、次のブログを参照してください。

2. 接続時間分類 (CTC) 損失関数

幸いなことに、音声認識にニューラル ネットワークを使用する場合、単語レベルの転写を可能にするコネクショニスト時間分類 (CTC) 目的関数を使用することで、音素の概念を捨てることができます。簡単に言えば、CTC は複数のシーケンスの確率を計算します。シーケンスとは、音声サンプルのすべての可能な文字レベルの転写のセットです。ニューラル ネットワークは、目的関数を使用して文字列の確率を最適化し (つまり、最も可能性の高い転写を選択)、予測と実際の結果を比較して予測の誤差を計算し、トレーニング中にネットワークの重みを継続的に更新します。

CTC 損失関数の文字レベルの誤差は、従来の音声認識モデルで一般的に使用されているレーベンシュタイン誤差距離に似ていることは注目に値します。文字生成 RNN の場合、異なる発音が異なる文字に対応する音声言語 (エスペラント語、クロアチア語など) では、文字と単語のエラー距離は同じです。対照的に、英語などの他の音声文字では、文字と単語のエラー距離は大きく異なります。

CTC と Baidu の調査について詳しく知りたい場合は、次のリンクをご覧ください。

  • http://suo.im/tkh2e
  • http://suo.im/3WuVwV
  • https://arxiv.org/abs/1703.00096

アルゴリズムを最適化し、従来型/深層音声認識モデルを構築するために、SVDS チームは音声認識プラットフォームを開発しました。

3. データの重要性

言うまでもなく、音声をテキストに書き起こすシステムをトレーニングするには、デジタル音声ファイルとその録音の書き起こしの両方が必要です。モデルは最終的に新しい音声を解釈するために使用されるため、トレーニングを増やすとパフォーマンスが向上します。 SVDS の研究者は、モデルのトレーニングに大量の英語の音声とその書き起こしを使用しました。データには、LibriSpeech (1,000 時間)、TED-LIUM (118 時間)、VoxForge (130 時間) などが含まれています。次の図は、期間、サンプリング レート、注釈など、これらのデータセットの情報を示しています。

  • リブリスピーチ: http://www.openslr.org/12/
  • TED-LIUM: http://www.openslr.org/7/
  • ヴォックスフォージ: http://www.voxforge.org/

モデルがデータにアクセスしやすくするために、すべてのデータを同じ形式で保存します。各データは、.wav ファイルと .txt ファイルで構成されます。たとえば、Librispeech の「211-122425-0059」は、Github の 211-122425-0059.wav と 211-122425-0059.txt に対応します。これらのデータのファイルは、Dataset オブジェクト クラスを使用して TensorFlow グラフに読み込まれます。これにより、TensorFlow はデータの単一バッチの読み込み、前処理、読み込みをより効率的に実行でき、CPU と GPU メモリの負荷を軽減できます。データセット オブジェクトのデータ フィールドの例を以下に示します。

  1. クラス DataSet:
  2.  
  3. def __init__(self、txt_files、thread_count、batch_size、numcep、numcontext):
  4.  
  5. # ...
  6.  
  7.    
  8.  
  9. def from_directory(self, dirpath, start_idx=0, limit=0, sort=None):
  10.  
  11. txt_filenames(dirpath, start_idxstart_idx=start_idx, limitlimit=limit, sortsort=sort)を返します
  12.  
  13.    
  14.  
  15. def next_batch(self, batch_size=なし):
  16.  
  17. idx_list = 範囲(_start_idx, end_idx)
  18.  
  19. txt_files = [_txt_files[i] ( idx_list内のiの場合)]
  20.  
  21. wav_files = [ x.replace ( '.txt' , '.wav' )内のxtxt_files場合]
  22.  
  23. #オーディオテキストをメモリロードする
  24.  
  25. (オーディオ、テキスト) = get_audio_and_transcript(
  26.  
  27. txt_ファイル、
  28.  
  29. wav_ファイル、
  30.  
  31. _numcep、
  32.  
  33. _numコンテキスト)

IV. 特徴表現

機械が音声データを認識するには、まずデータを時間領域から周波数領域に変換する必要があります。オーディオ データの機械学習機能を作成する方法はいくつかあり、任意の周波数 (100 Hz など) でのビニングや、人間の耳が認識できる周波数でのビニングなどがあります。この一般的な音声データ変換では、さまざまなケプストラム特徴の 13 ビットまたは 26 ビットのメル周波数ケプストラム係数 (MFCC) を計算する必要があります。変換後、データは時間 (列) と周波数係数 (行) のマトリックスとして保存されます。

自然言語の音は独立しておらず、文字と 1 対 1 で対応していないため、重なり合うウィンドウ (前後 10 ミリ秒) のサウンド データをニューラル ネットワークに学習させることで、共調音 (1 つの音節の発音が他の音節にどのように影響するか) の効果を捉えることができます。次のコードは、MFCC 機能を取得する方法と、オーディオ データのウィンドウを作成する方法を示しています。

  1.   wavファイルを読み込む
  2.  
  3. fs、オーディオ = wav.read (オーディオファイル名)
  4.  
  5.    
  6.  
  7. # mfcc係数を取得する
  8.  
  9. orig_inputs = mfcc(オーディオ、サンプルレート=fs、numcepnumcep=numcep)
  10.  
  11.    
  12.  
  13. #トレーニングセットタイムスライスについてコンテキストをコピーする必要があります。これにより
  14.  
  15. トレーニング入力 = np.array([], np.float32)
  16.  
  17. train_inputs.resize((orig_inputs.shape[0], numcep + 2 * numcep * numcontext))
  18.  
  19.    
  20.  
  21. time_sliceが範囲内の場合(train_inputs.shape[0]):
  22.  
  23. #過去numcontext時間スライスまで取得します
  24.  
  25. # 空mfcc機能完備
  26.  
  27. 必要空過去 =最大(0, ((time_slices[0] + numcontext) - time_slice))
  28.  
  29. empty_source_past = list(empty_mfcc、 empty_slots範囲(need_empty_past))
  30.  
  31. data_source_past = orig_inputs[ max (0, time_slice - numcontext):time_slice]
  32.  
  33. アサート(len(empty_source_past) + len(data_source_past) == numcontext)
  34.  
  35. ...

この RNN の例では、各ウィンドウの前後に 9 つのタイムポイント (合計 19 のタイムポイント) を使用します。ケプストラム係数は 26 個あり、25 ミリ秒の期間にわたって合計 494 のデータ ポイントがあります。データのサンプリング レートに基づいて、16,000 Hz で 26 個のケプストラム特徴と 8,000 Hz で 13 個のケプストラム特徴を提案します。以下は 8,000 Hz データの読み込みウィンドウです。

RNN 音声認識用にデジタル オーディオを変換する方法について詳しく知りたい場合は、Adam Geitgey の紹介をご覧ください: http://suo.im/Wkp8B

5. 音声の連続性のモデル化

長短期記憶 (LSTM) は、長期シーケンスに依存するデータのモデリングに適したリカレント ニューラル ネットワーク (RNN) の一種です。この方法は、過去の情報を現在の時点で記憶しておくことができるため、出力結果を改善できるため、時系列データのモデリングに非常に重要です。そのため、この機能は音声認識に非常に役立ちます。 TensorFlow で LSTM セルをインスタンス化する方法を確認したい場合は、DeepSpeech に触発された双方向再帰型ニューラル ネットワーク (BiRNN) の LSTM レイヤーのサンプル コードを以下に示します。

  1. tf.name_scope( 'lstm' )を使用する場合:
  2.  
  3. #方向セル:
  4.  
  5. lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_cell_dim、forget_bias=1.0、state_is_tuple= True )
  6.  
  7. # 逆方向セル:
  8.  
  9. lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_cell_dim、forget_bias=1.0、state_is_tuple= True )
  10.  
  11.    
  12.  
  13. # ここで、`layer_3` をLSTM BRNN セル入力し LSTM BRNN出力を取得します
  14.  
  15. 出力、output_states = tf.nn.bidirectional_dynamic_rnn(
  16.  
  17. セル_fw=lstm_fw_cell、
  18.  
  19. セル帯域幅=lstm_bw_cell、
  20.  
  21. # 入力はLSTMの前の完全接続層です
  22.  
  23. 入力=レイヤー3、
  24.  
  25. dtype=tf.float32、
  26.  
  27. 時間メジャー = True
  28.  
  29. シーケンス長=シーケンスの長さ)
  30.  
  31.    
  32.  
  33. tf.summary.histogram( "アクティベーション" , 出力)

LSTM ネットワークの詳細については、RNN と LSTM セルの動作の概要を参照してください。

  • http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  • http://colah.github.io/posts/2015-08-Understanding-LSTMs/

さらに、RNN 以外の音声認識手法、例えば RNN よりも計算効率の高い畳み込み層などの研究も行われています: https://arxiv.org/abs/1701.02720

6. ネットワークのトレーニングと監視

例のネットワークは TensorFlow を使用してトレーニングされているため、TensorBoard の視覚化グラフを使用してトレーニング、検証、パフォーマンス テストを監視できます。 Dandelion Mane は、2017 TensorFlow Dev Summit で役立つアドバイスを提供しました: https://www.youtube.com/watch?v=eBbEDRsCmv4

tf.name_scope を使用して、ノード名とレイヤー名を追加し、ファイルに要約を書き込みます。その結果、双方向ニューラル ネットワーク (BiRNN) の場合のように、自動的に生成されたわかりやすい計算グラフが生成されます。データは左下から右上へ、さまざまな操作間で渡されます。わかりやすくするために、さまざまなノードに名前空間でラベルを付けたり色分けしたりできます。この例では、水色の fc ボックスは完全に接続されたレイヤーに対応し、緑色の b ボックスと h ボックスはそれぞれバイアスと重みに対応します。

学習速度を制御するために、TensorFlow が提供する tf.train.AdamOptimizer を使用します。 AdamOptimizer は、モメンタム (パラメータの移動平均) を使用してハイパーパラメータの動的な調整を容易にすることで、従来の勾配降下法を改善します。ラベル エラー率のサマリー スカラーを作成することで、損失とエラー率を追跡できます。

  1. 要約統計プレースホルダーを作成する  
  2.  
  3. tf.name_scope( "accuracy" )を使用する場合:
  4.  
  5. #パス編集(レーベンシュタイン)距離を計算する
  6.  
  7. 距離 = tf.edit_distance( tf.cast (self.decoded[0], tf.int32), self.targets)
  8.  
  9.    
  10.  
  11. # ラベルエラー率(精度)を計算する
  12.  
  13. self.ler = tf.reduce_mean(距離、名前= 'label_error_rate' )
  14.  
  15. self.ler_placeholder = tf.placeholder(dtype=tf.float32、shape=[]) です。
  16.  
  17. self.train_ler_op = tf.summary.scalar( "train_label_error_rate" 、 self.ler_placeholder)
  18.  
  19. self.dev_ler_op = tf.summary.scalar( "検証ラベルエラー率" 、self.ler_placeholder)
  20.  
  21. self.test_ler_op = tf.summary.scalar( "test_label_error_rate" 、 self.ler_placeholder)

7. RNNを改善する方法

シンプルな LSTM RNN ネットワークを構築したので、次の質問は、これをどのように改善し続けるかということです。幸いなことに、オープンソース コミュニティでは、多くの大企業が独自の *** 音声認識モデルをオープンソース化しています。 2016 年 9 月、Microsoft の論文「Microsoft 2016 会話型音声認識システム」では、NIST 200 スイッチボード データ上の単一システム残差ネットワークで 6.9% のエラー率を達成する新しいアプローチが実証されました。彼らは、畳み込み+再帰型ニューラル ネットワークの上に、いくつかの異なる音響モデルと言語モデルを使用しました。過去 4 年間に Microsoft チームと他の研究者によって行われた主な改善点は次のとおりです。

  • 文字ベースの RNN での言語モデルの使用
  • 畳み込みニューラルネットワーク(CNN)を使用してオーディオから特徴を抽出する
  • 複数のRNNモデルを組み合わせる

注目すべきは、過去数十年間に従来の音声認識モデルによって得られた研究結果が、現在のディープラーニング音声認識モデルにおいても依然として役割を果たしていることです。

出典: Xuedong Huang、James Baker、Raj Reddy 共著「音声認識の歴史的観点」Communications of the ACM、Vol. 57 No. 1、94-103 ページ、2014 年

8. 最初のRNNモデルをトレーニングする

このチュートリアルの Github では、著者が、読者が TensorFlow で RNN と CTC 損失関数を使用してエンドツーエンドの音声認識システムをトレーニングするのに役立ついくつかの紹介を提供しています。ケースデータのほとんどはLibriVoxから取得されます。データは次のフォルダに保存されます。

  • 電車: train-clean-100-wav (例 5 件)
  • テスト: test-clean-wav (例 2 件)
  • 開発: dev-clean-wav (例 2 件)

これらの例でトレーニングすると、トレーニング データの単語エラー率 (WER) が過剰適合しているのに対し、テスト セットと開発セットの WER は約 85% であることがすぐにわかります。単語エラー率が 100% ではない理由は、各文字 (a ~ z、カンマ、スペース、空白) に 29 通りの可能性があり、ニューラル ネットワークがすぐに学習するためです。

  • 一部の文字(e、a、スペース、r、s、t)は他の文字よりも一般的です
  • 子音-母音-子音は英語の単語形成の特徴である
  • MFCC入力音信号の振幅特性の増加は、文字azにのみ関連している。

Github のデフォルト設定を使用したトレーニング結果は次のとおりです。

より強力なモデルをトレーニングする場合は、これらのフォルダーに .wav ファイルと .txt ファイルを追加するか、新しいフォルダーを作成して configs/neural_network.ini でフォルダーの場所を更新します。注意: 強力な GPU があっても、数百時間分のオーディオのトレーニングには長い時間がかかる場合があります。

<<:  画像内の文字の教師なし学習

>>:  機械学習の教科書に出てくる7つの典型的な問題

ブログ    
ブログ    
ブログ    

推薦する

コロナウイルス:スマートシティ変革のきっかけ

都市環境は、物理的、デジタル的、人間的システムを統合し、住民と企業に優れた成果をもたらします。 [[...

衣服にNFCを追加: 袖をかざすだけで安全に支払い

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

機械学習が医療に革命を起こす

その中で、ヘルスケア業界は強力なスポンサーであり、新しいテクノロジーを積極的に導入してきました。人工...

AI を使って現実世界の問題を解決する 13 の Web3 プロジェクト

原文: https://shardeum.org/blog/ai-and-web3-crypto-p...

...

2018 CCF BDCIコンペティションのグローバルローンチ:データ駆動型、スマートな未来

8月11日、2018年のCCFビッグデータ&Computational Intelligenceコン...

...

「人工知能+学習」は教育をより良くするのでしょうか?

「教育は死んだが、学習は不滅である。」半世紀前、アメリカの教育思想家イリイチは著書『脱学校社会』の...

水中ロボットが極地でその能力を披露

水中ロボットが極地でその能力を披露[[439571]]科学研究員らが甲板上で展​​開準備を進めている...

ディープラーニングフィードフォワードニューラルネットワークの簡単な紹介

索引多層パーセプトロン (MLP) 入門ディープニューラルネットワークの活性化関数ディープニューラル...

はるか先へ! BEVHeight++: 道路脇の視覚的な 3D オブジェクト検出のための新しいソリューション!

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

オブジェクトストレージがAIの最大の課題を克服するのに理想的な理由

2020 年のコロナウイルスのパンデミックは、データの迅速な分析と解釈の重要性、そして情報に基づいた...

人工知能は教育のバランスのとれた発展に貢献する

最近、中国人工知能学会、中国言語知能研究センターなどの主催による第3回中国知能教育会議が西安で開催さ...

...

...