tetsuのlog

テツがひとりでに読んだ論文とか行き詰まったところをshareする場

YANS2019参加ログ

はおー(覇王)、テツです! 8月26 ~ 28日で行われたNLP若手の会(YANS)第14回シンポジウム先輩と研究室の留学生と参加してきました。楽しいことや学ぶことがたくさんあったので振り返りブログを書こうと思います。

ポスター発表

今年の2月くらいから取り組んでいた研究について発表いたしました。

日本語における文字体系を考慮した文書分類の提案

長澤駿太, 北田俊輔, 彌冨仁(法政大)

[スライド], [ポスター]

先行研究*1では以下の画像のように日本語の漢字の表意性に着目し、文字画像からCNNを用いて形状を捉えた文字表現を学習するcharacter encoder (CE) というものが提案されています。

f:id:tetsu316:20190908115632p:plain
文書分類モデルの概要

CEの問題点として同じ形状で意味の違う漢字(たとえば 大, 太, 犬)や 平仮名・片仮名などの表意性を持たないような文字に対して適切な表現が得られないというものがあります。この問題に対して既存の文字表現手法(lookup table)と組み合わせることで各文字に対し適切な表現を得ようとするのが今回の研究発表の内容になっています。

YANSの2週間前ほどに実装ミスが発覚し、本当にギリギリでしたが発表できてよかったです。

自分のところに人が来てもらえるか心配でしたが、多くの人に来ていただきディスカッションを行うことができました。中には自分と似たような問題設定で別の手法を提案している方も来てくださり、より深いディスカッションができたと思います。

f:id:tetsu316:20190909160132j:plain:w300
ポスターとオタク

Kaggle ハッカソン

YANSにて行われたKaggleハッカソンにも参加しました。先輩と初の直接対決となるため気合MAXです。1チーム、3 ~ 4人の構成で自分のチームは社会人の方2名、学生2名というバランスの取れたチームでした。データセットは2年前に行われたkaggleコンペのQuora Question Pairsデータを使用しました。学習用、開発用が渡され、最後にテストが渡される感じでした。

二年前のコンペというものもあり、このデータセットに対してBERTやXLNetなどの最新の手法は試されていなかったので、最新手法の適応を見る感じだったのかな?と勝手に思っています。その中で一人でコツコツ特徴量作ってLIghtGBMで遊んでいました。癖のあるデータセットだったのでこれ使えそう!みたいなのを探すのが楽しかったです。 時間も少ない中、僕らのチームではXGBoostを使ったモデルや、最新手法であるRoBERTa*2を使ったモデルが生成されていきました。RoBERTaが開発用データで圧倒的な精度を出し、僕らの最後の提出はRoBERTaのみ結果を使用しました(つまり僕は weight 0)。

結果は優勝でした!

f:id:tetsu316:20190908115527j:plain
best-team

一人は飛行機の都合で早期帰宅してしまいました、残念。 嬉しいけど切ないようなこの感じ、何なんだろう...RoBERTa...

ハッカソンのsolutionのスライドは近日公開予定とのことなので後日はらせていただきます。

kaggleハッカソンを通しても社会人の方とも交流できて楽しかったです!ぜひまたやりたい!

YANS夜の部(ボードゲーム)

初日の夜、僕はkaggleハッカソンの作業をサボり、ボードゲームに参加していました。最初の方はハッカソンのデータとにらめっこしていたのですが気づくとボードゲーム卓に..

お酒を飲みながらめちゃくちゃ盛り上がりました。僕が独創的な人間過ぎて周りにイッヌという謎のあだ名もつけられたりもしました。ボードゲームやってた方にはイッヌって名前のほうが認知されてるかも..

こちらも社会人、学生の枠を超えて楽しめました!

まとめ

初の学会ということもあり、緊張とドキドキがたくさんありました。 研究の面では普段の研究室内では出ないような意見をもらうことができました。今後の研究の参考にさせていただきます。また、他の方々の研究も興味深い物が多くモチベーションも上がり、良い刺激になりました。 交流の面ではYANSを通して交流の場もたくさんあったので、いろいろな方と話すことができました。今度は言語処理学会を目指して頑張っていこうと思います。

皆さん、言語処理学会で会いましょう! では、せーのっ、北海道はでっかいどう!!!!!!!

f:id:tetsu316:20190908114911j:plain
北海道のオタク

付録 北海道の飯

北海道はでっかいどうLTを作成したので、もし北海道行くよ!みたいな人がいればぜひ見てください。おすすめの飯を乗っけてあります。

*1:[1810.03595] End-to-End Text Classification via Image-based Embedding using Character-level Networks https://arxiv.org/abs/1810.03595

*2:[1907.11692] RoBERTa: A Robustly Optimized BERT Pretraining Approach https://arxiv.org/abs/1907.11692

Gunosyのハッカソンに参加してきました

f:id:tetsu316:20190529122643j:plain
お気に入りのシール

こんにちは、テツです!!

5月25, 26日に開催されたGunosyデータ分析ハッカソンに参加してきました。

manaboo.me

それではレポートです!!!

ハッカソン内容

記事のデータからその記事のメディアを推定するといったタスクでした。 Kaggleと同じようにtrainとtestが分けられていて、testの予測結果をsubmitしてスコアがわかる方式で、評価指標はaccuracyでした。 データとしては記事のタイトル、記事の内容( 200文字まで )、投稿時刻が与えられました。 50クラス分類でしたが、そこまで難しくはなくハッカソン終盤では1位のスコアは96.0%ほど出ていました。 計算リソースとしては手元のローカル環境かGoogleのColaboratoryを使う形でした。僕はDeepの方が得意なのでGPUが使用できるColaboratoryを使用しました。

結果

結果的に順位は3位でした!!!!

賞金5千円と景品としてモバイルバッテリー、Gunosyカラーペンをいただきました!!

初のハッカソンとしては大健闘だったのではないかと思います!

f:id:tetsu316:20190529122024j:plain:w300
オタク

やったこと

ちょうど今Kaggleでjigsawのコンペが開催されるということもあり、同じような手法を使いました! テキストデータを軽く眺めたところ、単語分割がうまくいきそうになかったので、自分の研究で使用している文字レベルの処理を行いました。

タイトルと内容をそれぞれ

LSTM -> 1×1 Conv1d -> concat -> fc

って感じのネットワークに流しました。 ゴリゴリのDeepをやってるのは僕だけでしたね...

他にはcosine annealing*1を採用したり、 online hard example mining*2を導入したりと色々盛り込みました!

チャレンジとしては前回の記事で紹介したAugmenting Data with Mixup for Sentence Classification: An Empirical Study*3を実際に実装して使用してみました!!

tetsu316.hatenablog.com

今回はsentenceMixupの方で試してみました。 結果としてはdata augmentation手法としてはかなりよく、過学習は抑制の期待はできるが精度はあまり変わらないって感じでした...

ちょっと疑問の残る論文ではあったので効果があったことを身を以って知れてよかったです!

Mixupを使わないモデルで5-fold cross validationのアンサンブルで推論したところ93.3%の結果が出ました!!( これがほぼ最高スコアでした )

他の参加者の方の手法

1位と2位の方は自分で特徴量を作成したり、データを綺麗にしたり特徴量エンジニアリングが素晴らしかったです。 特に1位の方は独走していて、分析力がすごかったです。

また、自分の使用しなかった投稿時刻のデータにかなり情報があったそうで、特にデータを分析したりすることもせず、NNにぶち込んでしまっていたため見落としてしまいました。

なんでもDeepでやればいいってもんじゃないってことを学びました...

TfidfやBag of Wordsといった手法はそこまで効かないらしく、一筋縄ではいかないようなハッカソンでした。

まとめ

2日間という限られた時間の中で自分のベストを出せて、かなり満足感のあるハッカソンでした!

懇親会ではいろんな方の手法を聞くことができて、かなり自分の成長に繋がったと思います。 年の近い方々と話すのはとても良い刺激になり、自分のモチベーションの向上にも繋がりました!

また、Gunosyさんの社員の方々とも色々話ができて楽しかったです!

これからもハッカソンやコンペなど積極的に参加していきたいと思いますのでみなさんよろしくお願いします。 次回ハッカソンに参加するときは、優勝したいです!!!

Augmenting Data with Mixup for Sentence Classification: An Empirical Study

お久しぶりです

こんにちは、テツです。 そろそろACLのaccept論文が出ますね、気合いが入ってきました。

今回はCVで良い精度を出してるMixupをNLPタスクに使用した論文を見つけたので、まとめました!!!

Mixupについて軽く触れてから論文の紹介に行こうと思います。

MIxupとは

2つのペアを上手いこと組み合わせて新しいデータセットを作るdata augmentationの手法です。

X_{ij} = \lambda X_i + (1 - \lambda)X_j

y_{ij} = \lambda y_i + (1 - \lambda)y_j

\lambda \in [0;1]はベータ分布から得られる値です。 こんな感じで2つのデータセットを組み合わせ1つのデータセットにします。 この時ラベルも1つではなくなりマルチラベルになります。

Mixupの詳しいことはこちらでご確認ください!!!

qiita.com

それでは論文の紹介です。

Augmenting Data with Mixup for Sentence Classification: An Empirical Study

1.どんなもの?

CVの分野で良い結果を出しているdata augumentation手法であるmixupをNLPのタスクに落とし込み、検証したという論文。

2.先行研究と比べてどこがすごい?

普通の正則化(dropoutやL2など)と比べ過学習を抑えることができる。

3.技術、手法のキモはどこ?

NLPタスクでのmixupにおいて2つの手法の提案

word Mixup

Embedding層により得られた行列B(R^{d \times length})でmixupを行う。 textのは全て固定長にする。(足りないところはゼロパッディング)

sentence Mixup

LSTMやCNNで得られたsentenceの表現をmixupする。 これは固定長じゃなくても良き。

4.どうやって有効だと検証した?

baselineとbaseline+dropout&L2との比較を複数のデータセットで比較した。

dataset

  • TREC
    • 質問のカテゴリ分類
  • MR
  • SST-1
  • SST-2
    • 上のbinary版
  • Subj
    • 件名のクラス分類??

wordMixup, sentenceMixupそれぞれでbaselineよりも良い精度をだした。 どちらが良いかはタスクによる感じ。

baselineと比べlossが上がらず過学習の抑制ができている。 sentenceMixupの方がtrainとvalidの差が少ない。

5.議論はある?

Gloveのpre-trainの学習ありとなし、pre-trainなしの3種で比較した。

pre-trainの学習ありはwordMixupで良い精度出ることがわかった。

まとめ

今回の論文はCVタスクのdata augmentation手法をNLPタスクに落とし込むものでした。 こんな感じでタスク別の手法を持ってこれるのはおもしろいので僕もやっていきたいなとおもいます。 MixupできたならRICAPとかできても良さそうだなあ、、、 RICAPの説明はこちら

qiita.com

論文リンク

Augmenting Data with Mixup for Sentence Classification: An Empirical Study (https://arxiv.org/abs/1905.08941)

mixup: Beyond Empirical Risk Minimization (https://arxiv.org/abs/1710.09412)

Data Augmentation using Random Image Cropping and Patching for Deep CNNs (https://arxiv.org/abs/1811.09030)

Mixupと言ったらにじさんじ

にじさんじ はいいぞ

CNN for Sentence Classificationの実装

はおーてっつんでーす

youtubeの登録チャンネルはほぼV tuberのテツです。友達いないからフォローしてね!!!

前回の論文読みを終えて、せっかくなので実装してみようと言うことでchainerでやってみました。

tetsu316.hatenablog.com

ソースコードは以下のgithubのリンクからご確認ください!!

github.com

データセット

今回は大学の授業の課題もあり、sentence単位での青空文庫の著者推定をやりました!! 夏目漱石江戸川乱歩太宰治芥川龍之介宮沢賢治の5名の作品を僕がテキトーに12作ずつ選んで10作を訓練データに、2作をテストデータにしました。

データセットの詳細は以下の通りになってます。

train数(sentence単位) test数(sentence単位)
夏目漱石 25224 1962
江戸川乱歩 25607 2545
太宰治 11805 2683
芥川龍之介 3473 235
宮沢賢治 4300 643

芥川隆ノ介と宮沢賢治が作品が短く、データが少し偏っています。

word2vecは、乾研究室で公開しているwikipediaで事前学習したモデルを使用しました。

前処理

  • ファイル読み込み
  • いらないところ削る + 「。」で文区切り
  • mecabによる分かち書き
  • word2vecのインデックスに変更

過学習抑制のために、先輩に教えていただいた、wildcard trainingを使用しました。(preprocessで行ってます) 簡単に説明しますと、単語ベクトルの一部をランダムで0にするって感じですね。気になった方は是非調べてみてください!!!

お先に結果

f:id:tetsu316:20190122014229p:plain
accuracy

f:id:tetsu316:20190122014235p:plain
loss

loss めっちゃ高いし過学習しとるやんけええええ

最後のpredictのconfusion matrix 表の見方は横が正解ラベルで縦が推測になってます。対角部分が高いと強いモデルになります。

f:id:tetsu316:20190122191029p:plain
confusion matrix

データの少ない芥川隆ノ介、宮沢賢治がうまく推定できてないですね。芥川隆ノ介を夏目漱石に間違えがちです。 でも5クラスで75%近くだからそこそこ良い精度出てるんでない?? 実装間違ってたりしたら是非、コメントとかで教えてください!!!

モデルの工夫

論文通り、word2vecにない単語を全部1つのランダムなベクトルに置き換えました。 あと、全てのベクトルを最大単語数の大きさでパディングしても良いのですが、それだと計算の無駄が多いため、バッチごとの最大でバッチごとにパディングを行うように変更しました。これをやるだけで時間が1/10くらい変わります。 Two Channelのモデルだけ載せておきます。

class TwoChannel(chainer.Chain):
    def __init__(self, w2v_w, batch_size):
        self.w2v_w = w2v_w
        self.batch = batch_size
        super(TwoChannel, self).__init__()
        with self.init_scope():
            self.embed1 = L.EmbedID(
                self.w2v_w.shape[0], self.w2v_w.shape[1],
                ignore_label=-1, initialW=self.w2v_w)
            self.embed1.disable_update()
            self.embed2 = L.EmbedID(
                self.w2v_w.shape[0], self.w2v_w.shape[1],
                ignore_label=-1, initialW=self.w2v_w)
            self.cnn_w3 = L.Convolution2D(None, 100, (3, 200))
            self.cnn_w4 = L.Convolution2D(None, 100, (4, 200))
            self.cnn_w5 = L.Convolution2D(None, 100, (5, 200))
            self.fc = L.Linear(None, 5)

    def __call__(self, xs):
        x = concat_examples(xs, padding=-1)
        len_x = len(x[0])
        h1 = F.reshape(self.embed1(x), (-1, 1, len_x, 200))
        h2 = F.reshape(self.embed2(x), (-1, 1, len_x, 200))
        sentence_vec = F.concat([h1, h2], axis=1)
        h_3 = F.max(
            F.tanh(self.cnn_w3(sentence_vec)), axis=2)
        h_4 = F.max(
            F.tanh(self.cnn_w4(sentence_vec)), axis=2)
        h_5 = F.max(
            F.tanh(self.cnn_w5(sentence_vec)), axis=2)
        concat = F.concat([h_3, h_4, h_5], axis=2)
        h2 = F.dropout(F.relu(concat), ratio=0.5)
        y = self.fc(h2)
        return y

NonStaticのモデルとStaticのモデルもGitHubの方に乗っているので、是非ご覧ください。

つまずいたとこ

可変長

一番つまずいたとこは、入力を可変長にしたことですね。今まで画像しかやってこなかったため脳死L.Classifierが使えなくて辛かったです。(自作text_classifier) chainer exampleのtext_classfierを色々といじくりまわし、頑張って理解しました、、(コピペ感あり) convert_seqとかconcat exsampleとか色々やることが多かったです。

エラー探し

なんだかんだこれに一番時間がかかった気がします。chainerなどのライブラリは簡単にdeeplearningのモデルが組める反面、中で全部やていただけるので エラーの場所が全然わからんくて辛かった、、、 今までprintデバッグしてたぼくですが、今回からimport pdb; pdb.set_trace()!!!!!!!!!!!!!!! を使い始めました。実行途中で処理を止めて色々買う人できるやつです。(下にリンク貼りま)。ゆうてまだp とかしかつかってないけどな!!!

docs.python.jp

ちなみに一番アホだったエラーはインデントずれててforwardがないって言われたことですかね!!! 先輩(いつもの人ではない)にクッソ煽られました。

メモリエラー

これは大したことではないのですが、word2vecの重みがでかい!!!マジで 僕は研究室の余り物マシン(4G程度)を使ってたのですが、乗らなくて研究用のマシンを使いました。 絶対いけるもんだと思ってて、実装ミスだとひたすら自分に言い聞かせてました。

大きくつまずいたのはこんなもんですが、他にも色々エラー出ては直しの繰り返しでした。

今後できそうなこと

データの偏りでlossとか大きくなっちゃったのかなーって思うので、データの偏りによってlossの大きさとかかえれたらなーとか思ってます。 データの偏りはいろんなとこでありそうな問題なので解決策をチョロチョロと探していきたいなあと思いま!!!(オーバーサンプリングやfocal lossなど調べて理解したらまとめま!)

まとめ

今回は初めて1から自分で前処理からネットワークまで組みました!!最初に回った時は本当にドッキドキで1時間に1回は確認してました笑 今回は研究室の色々な人にエラーなどみてもらったりしてもらいました。ありがとうございました。 また論文を読んで実装とかしてみたいなあと思います。これからも頑張るマーン

ビルマーン  

CNN for Sentence Classification 読んでみた

はおー

ちゃっす、てつです!!!最近はV tuberをみています。 ヒメヒナガチ推しでございます。毎日ヒメヒナの動画を見ながら寝ています。

今回も、先輩からお勧めいただいた論文を読んだので、それについて書いていこうと思います。

読んだ論文

CNN for Sentence Classification

https://www.aclweb.org/anthology/D14-1181

例の落合フォーマットでまとめてみた

はい、いつも通りの例のやつです。

1.どんなもの?

CNNと事前学習を用いたベクトル表現で文のクラス分類をしてみようって話

2.先行研究と比べてどこがすごい?

シンプルなモデルに少しのハイパーパラメータ調整で他の洗礼されたモデルとおんなじくらいの結果を出せた

3.技術、手法のキモはどこ?

google News をデータに事前学習したword2vecのパラメータを動かさないベクトル表現(static)とパラメータを動かす(non-static)を使う

アーキテクチャ

conv -> max-over-pooling -> fully conect -> softmax のシンプルなネットワーク

過学習抑制

  • dropout
  • two channel staticとnon-staticを両方使う。実際変わらんかった

4.どうやって有効だと検証した?

初期値ランダム、static、non-static、two channelの四つのモデルでおんなじデータセットを回した。 → ランダムが一番低いから他のは良いモデル!!! 他のモデルと大差のない結果を出せた。

5.議論はある?

word2vecにない単語の初期値をランダムにしているが、その範囲を事前学習の分散できめることで精度を上げることができる。 google newsからwikipediaにかえるとよくなったけど、これは正しいかは分らん

6.次に読むべき論文は?

他のCNNを使ったNLPの論文をよみたいなあ

まとめ

今回の論文はページ数も少なく、アーキテクチャも簡単なのでわかりやすいものでした!!! 次はRNNかなああ

実装した記事も書きました、よければ見てね

新年AlexNet

あけましておめでとうございます!! あけおめラインが来なかった男、テツです!!!!

2019年ですね、、、特に何もないですが、、

年末に遊ぶ友達もいなく、せっかくだし論文読んでみるかあ(初めて)したので、それについてまとめていきたいと思います。

読んだ論文

ImageNet Classification with Deep Convolution Neural Network http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

まとめ方

先輩からオススメしていただいた、落合フォーマットというものを使わせていただきました。

lafrenze.hatenablog.com

それではここからがまとめです。

ImageNet Classificaton with Deep Convolution Neural Networks

1.どんなもの?

ImageNetのデータセットに対して強い成果を出したネットワーク 過学習抑制のためにDropOut、Data augmentationを実装している

2.先行研究と比べてどこがすごい?

  • 他のクラス分類よりも良い精度を出せた
  • また過学習も少なく、validationとtestのaccuracyが近い
  • 認識したい物体が画面中央になくても認識できる
  • 様々なポーズの物体も認識できる

3.技術、手法のキモはどこ?

アーキテクチャ

  • ReLU関数の実装

   非線形ながらも勾配降下にて高速な処理を行える。

  • Local Response Normalizationの実装

   わかりそうでわからない。

  • Overlapping Pooling

   ストライドよりもサイズを大きくすることで、重なり合う部分も取れる。

過学習抑制

  • データオグメンテーション

   画像の水平移動、PCAを行い固有値にノイズを加える。

  • DropOut

   ランダムにいくつかのニューロンの出力を0に固定することで毎回違うネットワークを構築、アンサンブル学習を行う。

4.どうやって有効だと検証した?

コンペでの記録、また正しく分類したtestデータとトレーニングデータを比べてみた。

5.議論はある?

auto-encoderを使った圧縮の方が効率的。 層を一つでも減らすと性能は劣化する。

6.次に読むべき論文は?

もっと強いVGGとかResNet、話し出てきたauto-encoderとか

間違って解釈してしまっていることなどあれば、教えてください!

思ったこと

大学3年にして初めて英語の論文をちゃんと読んでみたけども、とても時間かかるしわからん単語多すぎわろた。 全部読むのにだいたい2日間くらいかかりました。 なんか思ったこととかもまとめておきます。

まず全部読まなくていい

これはよく言われていることですが本当に全部読まなくていいと思った。 一つしか読んでないので一概には言えないですけど、resultとか自慢話感強い(怒られそう)。 他にもNetworkの構成だって文見るより、図見た方が早いもん。データセットとかそこまで詳しくならんでもいいもん。 けどまだそこのいるいらないの区別はうまくつけられそうにないので、あと何回かはちゃんと読みます。

見る順番大事

今回は初だから最初からバーって読んだけど、この順番で見ればよかったとかは思う。 後から前のページに戻るのめんどくさいし、、、

Abstractは優秀

かなり優秀です、強い。大体のこと要約して書いてある。

introduction

研究背景とか、現在の問題点とか、、 初めての分野とかだと読んだ方が良さそう。

図とか表見る

アーキテクチャの構成とかは図とか表で読み取れます。分らない層とかがあればarchitectureを見る感じでいいかも

評価とかdiscussion

ここには今後の進展とかここがよくできたみたいな大事なこと書いてます。

やっぱり英語や数学は難しい

英語難しいです読んでも分らんもんはわかりません。 google翻訳でもうまくいきません、頑張ろう。 数学的ガチ理解したいときはもっと数式を掘り下げていくと。 最終手段だけど、世の中にはもっと賢い人たちがまとめてくれている、、、

総まとめ

まあやっぱり難しいし、疲れますね、、 慣れたら少しは楽に読めるようになると思うので、たくさん読んで慣れる。 これに尽きますわぁぁぁ。

次はVGG読もうと思いまする

MeCab-python3でsurfaceがうまく取れない

どうもはじめまして!!! テツです!!!!!!!!!!!!!!!!!! 自己紹介はまた今度やります

研究で自然言語処理をやろうと思い、mecab形態素解析やるぞ!!と意気込んでいたところ躓いてしまいました。 今回はそれの解決方法について書きたいと思います。

環境

とりあえず解析してみた

とりあえず、解析 f:id:tetsu316:20181228195732p:plain

なんかsurfaceの値がおかしい、、、

普通にparseでやるとうまくできる! あとコマンドのmecabでもうまくできます!

f:id:tetsu316:20181228195921p:plain

解決法

5回くらい現実逃避しつつ、ググりまくりました! 結果は、最新バージョンのバグでした!!

github.com

とりあえず先輩と同じバージョン(mecab-python3 0.7)にしてみたところ、

f:id:tetsu316:20181228195714p:plain

できました!!!

これで僕も自然言語処理できるようになりました。よかった

以上、初投稿でした!!!!!

ばーいばーい ※textの文面は気にしないでください