FC2ブログ

DockerはVMと同列に比較できるものではない

この記事はブロとものみ閲覧できます

Doc2Vec の解説ページへの不満とそれを踏まえた自分なりの解説

 当方、自然言語処理の初心者にも立ててない感じ(チュートリアルわけも分からずやってみただけの)だったんですが、ググって出た結果を見てもいまいち(゚Д゚)ハァ? という感想で、わからないところがスッキリしなかったので、ちょっと吐き出したいなと思います。

1.そもそもちゃんと解説する気がない(Word2Vecの解説サイトへ丸投げ)

2.Word2Vecの解説も「どんなことが出来るか」しか書いて無くて、「どういう入力を与えることでどういう結果が得られるのか」を説明していないからすっきりしない(私は最初、既に言葉をベクトル化して保持しているデータセットなのかと思った)。

3.理論とか内部構造の説明をつらつらと書いているサイトもあるが、結局学習させているんだか何だかわかんない。

4.ついでに言うと、自分の得たい結果を得るため、使用ケースに合わせるために「何が重要か」、「何を変える必要があるか」が書いてない(入力形式?、そもそも入力するデータの種類(文語、口語、ジャンル)?、train関数のパラメータ?)


いきなり Doc2Vec のことを調べているので、そもそもの自然言語処理の入口としておかしいとか、もうちょっとローレベルなところから始めるべきだとか、経験を積んでからじゃないと理解できなくて当然だとか、知ってる人からすれば色々思うところがあるかもしれません。

ただ、Doc2Vec という簡単にベクトル化出来る手法が出来ているのであれば、それをいきなり使う人だって当然いるわけで(というかリリースしてる人だってそれを望んで作ってるんだし)、入口に際してもうちょっとまともな解説記事は無いのかよ、っと思った次第です。

以下、もう既に時間掛けていろいろ調べたり、いじったりして大分スッキリしたので、自分なりの解釈を書きます。

1.まず、そもそもDoc2Vecとは何かというと、ライブラリ、API。既に学習されたモデルが配布されていて、それを Doc2Vec と呼んでいるとかではない
Doc2Vec の基本的なところは Word2Vec とほぼ一緒なんだけど、Word2Vec の機能にプラスして文章の特徴も一緒にベクトル化できる

2.そもそも私がコーパスって単語が結局何なのか分からずに詰まってしまったので解説すると、コーパスとは単なる「文章をまとめたテキストファイル」、中身だけを説明するなら「多数の文章」。特に学習に使いたいテキストファイル(フォルダに分けてzipに纏まってるときもある)のことを指すためにコーパスと呼んでるだけ。
それで、Doc2Vec はコーパスを入力として学習させなければならない。そうすると、文章の意味的な違いをベクトル(つまり数学の行列)にすることが出来る。

ベクトル化したら何が楽しいのかというと、「文章の意味」という曖昧な(定性的な)情報を、数値化して定量的な情報にできる。
しかも、コンピューターで自然言語処理させるってことは、高速に処理できたほうが良い。数値だとコンピューターは高速に処理できる。

3.結局学習させている。そして、ベクトルの出力や、類似度の算出は学習によって完成したモデルを使って行う。
ただし、Doc2Vecが学習に使っているアルゴリズム(ニューラルネットワーク)の層は浅いので、Doc2Vecは機械学習だけど、ディープラーニングではない。
(ディープラーニング(深層学習)とは、ニューラルネットワークを構築する学習アルゴリズムの中でも、特に層の深いニューラルネットワークを構築するものを言う。詳しくはWikipediaを参照。

4.何が重要かは流石にもっと使ってみないとわかんないですし、使用ケースによって変わるかもしれません。
でも使用ケースというか、どのような使い方をするのかは理由を含めて簡単に説明します。

さっき2.で説明したとおり、Doc2Vec はコーパスを入力することでコーパスに含まれる文章をベクトル化します。勝手に文章を投げればベクトル化してくれるAPIではないです。
もっと言うと、ベクトルは学習によって得られるので、どの文章をどんなふうにベクトル化できるかは入力によって決まります。

なので、纏めるとDoc2Vecは、「多数の文章をベクトル化するために、その多数の文章をDoc2Vecで学習させて、ベクトルを得る」ために使われます。ベクトルを得た後は、その人が使いたいように使います(類似度を単に算出するためだけとか、それを深層学習に掛けてもっと賢く分類できるようにするとか)。


因みに、コーパスに含まれる文章をベクトル化と言いましたが、学習モデルを使って、学習したデータに含まれない文章のベクトルを推定させることは出来ます(infer_vector() を使うんですが、それは次の記事で書きます)。


これからの人のために、上記の点を抑えていい感じにもうちょっと詳しく書いてくれてるサイトが今後できることに期待したいな。(お前が書け)

フォルダの整理とかをサボってしなかった時のデメリットというか損害

フォルダの整理とかの地味な作業が実は結構重要だという話。

普段から作業してるとどうしてもフォルダ分けが適当になってしまってます。
別にストレージのフォルダならファイルを保存してるだけで頻繁に行き来しないから良いんだけど、これをOneNoteでもやってしまっているという。

で、それがどういう不利益をもたらすかというと、

  • フォルダごとのまとまりが微妙になる。
    • 必要な情報がそのフォルダに無くて頻繁に移動が必要になったりする。
  • なんか似たような名前のフォルダがある。
    • 役割が明確でない。
    • 新しい事項をどこに保存したら良いか分かんなくなる。
  • 仮に引き継ぐんだとしたら他人にまで迷惑を掛けることになる。
    • 協力するなら全体のパフォーマンスが下がる。

しかも私の場合は、「今後どうなるかわかんないけど取り敢えず念のためフォルダを用意してしまう」という悪い癖もハッピーセット。

ここで学ぶべきはフォルダには一意性を持たせなきゃいけないってこと。

常に心がけるべきだけど、急いでるときとかは適当になってしまいがちです。なので、

  • 定期的にフォルダ分けを見直すようにする。
    • そうした方が絶対に作業効率は高まる。
  • 先がわからない時は必要になるまでフォルダを作らない。
    • そうしないと役割が後で曖昧になる。
  • 不要なフォルダは、削除する。
    • 探す先を無駄に増やすだけ。

ってことを常々分かっていても出来てないので、ここに書いた以上今後は出来るように、より一層肝に銘じて生きていくことをここに宣言します。

(もし、こうした方が良いってやり方を知っている人がいれば、是非教えて下さい。)

そう言えば、




なんて話もあるらしいんで、(結構サボりがちな私が言うのもなんですが)皆さんもアウトプットした方が良いと思いますよ。別に増田で日々の不満を爆発させるのとかでも良さそうですけど。

とはいえなんだかんだで5年間もブログを書き続けてるんで、私が就活する時は皆さんよろしくお願いしますね!(匿名だけど)

OneNote の良いところとかを挙げていく

以前居た学校では、私のまわりはみんなエバーノートを使っていたんですが、私自身はあんまり使いやすいと思えなくて敬遠しがちでした(そして彼らから私は好機の目で見られていた...)。これが今から2年前の話なので、Evernote の方も少しは変わってるかもしれません。

その後、色々と iCloud のメモだったり、いくつか試してみました。
結果、講義のノートを取ったり、詳しめにノートに書いて保存する電子ノートな用途では OneNote が一番しっくり来たので1年位使ってます。というわけで OneNote の特徴(主に良かった点)を挙げたいと思います。最後に残念な点も挙げておきます。

OneNote の気に入ってる所
1.セクションとノートブックがそれぞれ別の領域に表示できる
私はたくさんの項目が並んでいると、見難いし、どれがどれだか認識しにくく成って凄く嫌なんです。だから同じ階層のフォルダが沢山並んでるのは視覚的に耐えられません。でもOneNote ではどちらも常時表示されていながらも別の場所(2013 ではデフォルトでそれぞれ左と上、変更可能)なので、視覚的に邪魔にならずスッキリしているのでとても良いです。UI面はバージョンアップで変わるかもしれないし、Macだとノートブックを常時表示できてませんが、それでも今のところ満足です。

2.使わなくなったノートブックは見えなくすることができる
私が他のツールで視覚的に嫌だなと思っていたのが、終わったもの、もう使わないものまで見えてしまう点です。終わったのにそこに居座ってやがるのが紛らわしくて、ホント嫌でした(←でもそれを置いたのはお前だ)。OneNoteはノートブックを閉じるとリストから居なくなります。そのノートブックに所属するノートは全て見えなく出来ます。つまり終わったものはつまみ出せるんです。

3.閉じたノートブックはまた何時でも開くことができる
私は結構わがままなんで、終わったタスクも記録として残しておきたいタチです。(その頃自分が何をやっていたかが分かるため。出来れば細かく明確に知りたいです。)でも以前ならいちいち別のところに移して記録を取るなんて面倒臭いし、スッキリしてない方が嫌なので基本的に削除していました。ところがOneNoteは閉じても消えないし、開けば何時でも確認することができます。

4.ノートブックがファイルとして保存される
私的にここが他のツールとの最大の違いだと思います。Evernoteなどと違ってファイルとして実体(ユーザーに見える形のもの)があって、そこに保存されているので、何時でも移動やコピー、バックアップが容易にできるのです。これって自分にとってはかなり衝撃的でした。わりとマイクロソフトアンチなのにこれに限ってはマイクロソフトを見直してしまいした。これこそが、私の求めていたものだったからです。他のツール(EvernoteとかiPhoneのメモとか)ではそのツール内で記録される(ブラックボックス化されている)のが嫌でした。その端末やアカウントに依存してるのが、自分の記録なのに他人から管理されているのような感じがしていました。(見られている気がする、とかではなくて)機種やストレージを変更したり、アカウントを無くしたりしたら場合によっては二度とアクセスできなくなる可能性があるんです。バックアップをいちいちとらなくてもファイルとして保管できたら移動も楽なのにと思っていました。でも、既にOneNoteで10年以上前から実現していました。「既に持っていた」のに「知らないで使ってこなかっただけ」なんて、してやられた気分です。
ただし、無料版の場合は実体の保存場所がちょっとややこしいのでバックアップには注意が必要です。

5.ページタイトル無しの場合は最初の行を表示
「無題のページ」のままかとおもいきや、この場合ページの先頭に書かれたことがタイトル代わりとして表示されます。タイトルなんていちいち書いてらんないくらい素晴らしいアイデアが思いついた時とかでもすぐに書くことができます。個人的に iCloud のメモと同じ感覚で使えるのはナイスです。

6.サブページ機能
セクション内でも階層化が可能です(2段階まで)。さらに、階層化すると折りたためるので、セクション内にもう使い終わってしまい目障りなページがある場合は折りたたむことで隠すことができます。
バルス!!

OneNoteの残念な所
1.Mac と Windows でノートのページを表示させたときに、ノートコンテナーの文字が重なる。
これはフォントの問題だったりするかもしれないのでなんとも言えませんが、游ゴシック体がデフォルトになっているとOS毎に太さの設定などが異なっているのでおかしくなるようです。私の環境だと Mac で書き込んだものが Windows だと大きめに表示されます。
一応対策として、少しノートコンテナーの間隔を空けるようにしてますが、よほど一つのノートコンテナーに大量に書き込まない限りは大丈夫です。

2.無料版だと OneDrive にしか保存できない
つまり、他にも OneDrive に保存してるものがあって、容量が無くなったら保存できなくなります。ただ、 OneDrive の代わりはいくらでもあるし、どんなに容量を使おうが、OneDrive を OneNote 専用にしてしまえば問題ないと思います。まあ無料版なので仕方無いですね。

結論
OneNote は講義ノートに最適。

データ・ボリューム・コンテナは不要どころかもう使えない子

一つ前の記事の続き。
まずは更に踏み入ってボリュームだけでもコンテナ間で共有できるとか言われる所以について説明します。

前の記事で述べた通り、ボリュームとは単にコンテナ内にホスト(Docker コンテナを動かしてるOS上)のディレクトリをマウントさせたものでした。つまり、ホストの同じディレクトリをそれぞれのコンテナでマウントしてしまえば別にデータ・ボリューム・コンテナなんて無くても共有できるってことです。
Q.E.D.

証明は出来たかもしれないけどじゃあなんでデータ・ボリューム・コンテナでボリュームをマウントさせようとするのか?

それは上の方法だといちいち Docker コンテナを起動する(docker run)時にボリュームを指定する必要が生じて、環境をまとめるのが目的でDocker使ってんじゃないの?っていう本末転倒な状況に陥るためです。

データ・ボリューム・コンテナだとボリュームの設定をデータ・ボリューム・コンテナの立ち上げ時のみで済ませることが出来ます。その他のコンテナを起動時に --volumes-from でデータ・ボリューム・コンテナを指定するだけで良い。つまり、他のコンテナでは起動時にボリュームの場所を入力しなくて良いのです。

また、これにはさらなる利点があり、コンテナを立ち上げるホストが変わって、ボリュームをマウントしたいホストの場所が変わっても一ヶ所の変更のみで対応することが出来るんです。

でも、このままだとボリュームのディレクトリをいちいちデータ・ボリューム・コンテナ起動時に指定しないといけません。

そこで Docker Compose の登場

Docker Compose には複数のコンテナの設定を纏めて一つのファイルに書けるというメリットの他に、起動時のコマンドオプションを記述できるメリットがあります。よって、ボリュームのディレクトリを記述すれば、起動時の場所の指定も必要なくなります。
さらに、コンテナ間の通信時に docker-compose.yml 内で指定したコンテナ名をホスト名と置き換えられるので、コンテナ名を短くすればコンテナ内アプリのコーディングも楽になります。

しかし、ここで終わらなかった。

Docker Compose Version 3 での volumes_from 削除により無能と化す

平成29年5月31日時点で最新のDocker Compose Version 3 では、ボリュームに関する記述が変更され、よりシンプルになりました。
シンプルになったのは良いですが、結論を言うと同一ホスト上でのボリューム共有を目的にデータ・ボリューム・コンテナを利用する意義が無くなりました。つまり実はもうデータ・ボリューム・コンテナは要らない子。

まず、この件を説明するにはボリュームのマウント方式について説明する必要があります。
今まで、ボリュームについてホストのディレクトリを指定できることを当たり前のように説明していました。しかし、実はボリュームはホストのディレクトリを指定しなくとも作ることが出来るのです(詳しくは以下を参照)。
https://docs.docker.com/compose/compose-file/#volumes
コンテナ内のマウント先は必ず指定しなければなりません。
また、ボリュームには名前を付けることも出来ます(名前付きボリューム)。名前を付けると何が嬉しいかというと、Compose 内で定義しているコンテナ間でボリュームを共有することが出来るのです。Compose Version 2 から登場したトップレベルの volumes オプションで設定できます。

じゃあデータ・ボリューム・コンテナ要らないのか、となるのは早計で実はボリューム名を定義するとホストの場所を指定できなくなります。これだと自分で任意の場所を指定できないため、問題というか不便が生じます。なので、今迄はデータ・ボリューム・コンテナでホストの場所を指定した上で、他のコンテナでは volumes_from オプションでデータ・ボリューム・コンテナを指定することで共有していました。

しかし、なんとあろうことか Docker Compose Version 3 では volumes_from オプションを削除してしまいました。
https://docs.docker.com/compose/compose-file/compose-versioning/#version-3
しかももう更新から半年くらいは経ってる筈なのにたちの悪いことに日本語のページでこの件に触れられてる記事が殆ど無い。

でも、焦る必要はありません。(Apple風)
そもそもボリュームのホストの場所を指定できないことによる問題の根源は、好きな場所にボリュームを作れないことにありました。しかし、ホストの場所を指定しない場合にボリュームを作るディレクトリの場所は実は決まっています(/var/lib/docker/volumes/以下)。
問題はディレクトリの名前ですが、実は名前付きボリュームならボリューム名を含んだディレクトリ名となっているので、探してアクセスすることは出来ます。さらに、名前付きボリュームは名前を指定することでマウントが可能なので、再利用が可能です(永続化されている)。
※因みにコンテナ内のマウント先のみ指定した場合は適当な名前のボリュームになり、コンテナを削除した時点でコンテナから接続はできなくなりますが、データは/var/lib/docker/volumes/以下に残ります。

よって、別にデータ・ボリューム・コンテナを使えなくても不自由なく使用が可能です。

また、ボリュームを別に作る必要はありますが、実は docker volume create コマンドを使えばボリュームのホスト上での場所も指定することが出来ます。 できそうな雰囲気でしたが執筆時点では出来ませんでした。。
https://docs.docker.com/engine/reference/commandline/volume_create/
プラグインを使えば出来るというような話もありますが試してみない以上は真偽は不明。

これで作ったボリュームはトップレベルの volumes オプションで external: true すれば、マウントすることが出来ます。
https://docs.docker.com/compose/compose-file/#external

ホストに対して、ボリュームを作るのは一回で良いのでこれで無駄にデータ・ボリューム・コンテナを立ち上げなくても不便なく作業できます。

え、別に Version 2 で書けばよくね?

古いバージョンは廃止されることが宣言されてる。
せっかく環境依存性を抑えるためのツールなのに、時期が来たら使えなくなるとか意味が無い。
ということで、解決策がある以上皆さんこれからは Version 3 で書きませう φ(・∀・)

スポンサードリンク

ブログ内検索

プロフィール

ふじこlp

Author:ふじこlp
はてなブログへ移行しました。https://higechira.hatenablog.com/

ゆとりの大学生です。どれくらいゆとりかというと土曜日に通常授業を受けたことがただの一度もありません。

IBM時代のT43は観賞用となりましたが、X61は現役。
スクエアThinkPad X Series 最高です。
MacBook Pro 始めました。がやはりThinkPadに勝る打ち心地は存在しませんね。

カレンダー

10 | 2019/11 | 12
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

天気予報


-天気予報コム- -FC2-

フリーエリア

ブロとも申請フォーム

QRコード

QR

アクセスカウンター