自然言語処理-テキスト分類(4)CNN


CNN


CNNとは何ですか。


CNNはConvolutional Neural Networkの弱者であり,Denseニューラルネットワークの前に複数の階層の合成乗(Convolution)モデルを構築する.一般に画像データに用いられ、学習により入力データに対して最良の特徴を生成し、抽出した特徴を利用してデータを分類する方式が用いられる.

Yoon Kim博士が書いた"Convolutional Neural Network for Sentence Classification(2014)"によって、この方式がテキストにも効果的であることが証明された.
RNNが単語の入力順序を重要に反映している場合,CNNは文の地域情報を保存するとともに,各文成分の登場情報を学習を反映した構造と解釈する.学習の際,各フィルタの大きさを調整して言語の特徴値を抽出することは,従来のn-gram方式に類似しているといえる.
全体構造はRNNとあまり変わらない.モデル部分を変更すれば、CNNモデルで簡単に学ぶことができます.
前文を参照してファイルのロードが完了したとします.
モデルのスーパーパラメータを決定します.
model_name = 'cnn_classifier_en'
BATCH_SIZE = 512
NUM_EPOCHS = 2
VALID_SPLIT = 0.1
MAX_LEN = train_input.shape[1]

kargs = {'model_name': model_name,
        'vocab_size': prepro_configs['vocab_size'],
        'embedding_size': 128,
        'num_filters': 100,
        'dropout_rate': 0.5,
        'hidden_dimension': 250,
        'output_dimension':1}
CNNモデルを生成するためにクラスを生成します.
埋め込みベクトルを生成した後,Conv 1 Dにおけるkernel sizeが3,4,5の3つの合成二層を用いた.また、合成乗算ニューラルネットワーク毎にmaxfulling層を適用し、最後に、オーバーマッチングを防止するためにDroputと完全接続(完全接続層)の2層を積層して最終出力を形成する.
class CNNClassifier(tf.keras.Model):
    
    def __init__(self, **kargs):
        super(CNNClassifier, self).__init__(name=kargs['model_name'])
        self.embedding = layers.Embedding(input_dim=kargs['vocab_size'],
                                     output_dim=kargs['embedding_size'])
        self.conv_list = [layers.Conv1D(filters=kargs['num_filters'],
                                   kernel_size=kernel_size,
                                   padding='valid',
                                   activation=tf.keras.activations.relu,
                                   kernel_constraint=tf.keras.constraints.MaxNorm(max_value=3.))
                     for kernel_size in [3,4,5]]
        self.pooling = layers.GlobalMaxPooling1D()
        self.dropout = layers.Dropout(kargs['dropout_rate'])
        self.fc1 = layers.Dense(units=kargs['hidden_dimension'],
                           activation=tf.keras.activations.relu,
                           kernel_constraint=tf.keras.constraints.MaxNorm(max_value=3.))
        self.fc2 = layers.Dense(units=kargs['output_dimension'],
                           activation=tf.keras.activations.sigmoid,
                           kernel_constraint=tf.keras.constraints.MaxNorm(max_value=3.))
    
    def call(self, x):
        x = self.embedding(x)
        x = self.dropout(x)
        x = tf.concat([self.pooling(conv(x)) for conv in self.conv_list], axis=-1)
        x = self.fc1(x)
        x = self.fc2(x)
        
        return x
ここまで進めば,後の部分も前の文章のようにモデルコンパイルやCalback宣言,学習を行うことができる.学習が完了したら、ビジュアル化チェックを行い、結果を表示し、キャッシュにコミットします.

スコアはRNNよりやや低かったが,性能が高いことが分かった.
ここまで,機械学習/深さ学習モードを用いたテキスト分類実習を行った.ここで行った実験は簡単な実施形態であるので,多様な方法で性能を改善することを試みることができる.