モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

長野ディープラーニング同好会 #14

長野ディープラーニング同好会14回めを開催しました。

長野ディープラーニング同好会 #14

自分が来年度の平日夜動けなくなる可能性があり、一旦休止するかもということで、これまでのまとめの意味もふくめて、簡単なコンペみたいなのをやってみました。

CIFAR10の認識をColabで10分だけ学習させて、テストデータでの認識率が一番高かった人の優勝、みたいなものです。
現代のCNNの直接の祖先であるLeNetをベースラインとして、そこから各種手法を取り入れていってどこまで上げられるか、という感じに行いました。
論文等ぐぐればCIFAR10認識のSoTA手法が出てくると思うのですが、そこはColab環境で「10分だけの学習時間」というしばりがあるため、例えば単純にネットワークを大きくすればいいとはならないわけです。

ただ、いきなりなにもない状況からだとみな書けないと思うので、下記のようにサンプルとなるコードを用意しました。

https://github.com/stealthinu/naganodeeplearningclub/blob/master/cifar10_10min.ipynb

最初は、非常に簡単にですが各手法がどういうことやっていてどんなメリット・デメリットが有るのかをざっと説明しました。
そこから各種手法を入れたり、パラメータを調節して認識率を上げてもらうようにしていただきました。

結局、ベースラインの70%に対し、80%の認識率になった方が一番になりました。

次回はどうなるかわかりませんが、とりあえずもう一度、2年前にやったディープラーニングハンズオンみたいなことをやれたらいいな、と考えています。

chroot環境で動くapache 2.4でCGIがPermission deniedになる問題

CentOS7 で chroot 環境で動く apache 2.4 の設定で、CGIがうまく動かないという相談を受けました。

apache 2.4 では mod_cgi ではなく mod_cgid を使うのですが、

[cgid:error] (13)Permission denied: [client *****] AH01257: unable to connect to cgi daemon after multiple tries: *****

のような感じのエラーが出て動かないという状況でした。

mod_cgid の設定は下記のようになっていました。

LoadModule cgid_module modules/mod_cgid.so

<IfModule cgid_module>
    Scriptsock /var/run/cgid/cgisock
</IfModule>

ここで「/var/run/cgid/」は chroot 環境のディレクトリに作られていて、パーミッションも与えられていて、実際 cgisock ファイルも apache が作成できている状況でした。

で実はこの「Scriptsock /var/run/cgid/cgisock」の指定のところ、よくあるのは「Scriptsock cgisock」のようにフルパスではなく書かれているのですが、この指定だと log ディレクトリ内に sgisock ファイルが作られてしまうため、このようにフルパスでの指定になっていました。

パーミッションについて色々試してもダメだったため、下記のように「Scriptsock /var/run/cgid/cgisock」を「Scriptsock cgisock」に修正して(もちろんディレクトリのパーミッションやオーナーは同じ設定)動かしたところ、無事に動くようになりました。

LoadModule cgid_module modules/mod_cgid.so

<IfModule cgid_module>
    Scriptsock cgisock
</IfModule>

なので cgisock ファイルは logディレクトリ内に作成されています。

chroot環境下のときの apache と mod_cgid のパスの扱いに齟齬がある?のかなと推測していますが、ちゃんと追って調べていません。

とりあえずこうやれば動く、ということだけ。

長野ディープラーニング同好会 #13

ディープラーニング同好会13回めを開催しました。

長野ディープラーニング同好会 #13

この回はちょっと人数が少なくて、新規に来られたかたも居なかったため、Colab上でKerasを使って、もっと大きなネットワークとTPUを使って、CIFAR-10の画像認識などを試せました。

あと、バックプロパゲーションが数式から導き出せることをなるべく直感的に分かる説明(と自分は思ってる)を聞いてみてもらいました。
これは前に多層ニューラルネットバックプロパゲーションの学習が、数式から導出するのをどうするのか、という話があったとき、単に微分するのを勉強会で導出するのはみんな興味持ってもらえないだろうなと思ったのがありました。
ので、勉強会とかでもっと直感的に、なるべく数式が簡単になる説明の方法を考えたのでした。
が… 思っていたよりもみんな、???というような反応でちょっと残念でした。力足らずです。

長野ディープラーニング同好会 #12

ディープラーニング同好会12回め開催しました。

長野ディープラーニング同好会 #12

Colab上でKerasを使って、各関数でなにをやってるのかなどを説明しながら、MNISTやCIFAR-10の認識などを体験してもらいました。
これは最初の3回くらいまででやってたことを再度やり直してるわけで、多少資料直したりしてこなれてきた感じになりました。
でもまだMNISTで、画像の認識とかやらないとあまり楽しくないよなあ、というか「ディープ」ではないよねと思って、次回はもっと大きなネットワークで、TPU使って学習させて試せればと思います。

また別件で、登山者をディープラーニングの画像認識使ってカウントするという件についての説明をしました。
これは別でSlackをあげてあるのですが、登山者カウンターのチャンネルを作ってそこで話をすすめていくことになりました。

次回は、またColab上でKerasを使って、もっと大きなネットワークとTPUを使って、CIFAR-10の画像認識などを試す予定です。
時間があれば、多層ニューラルネットの関数から微分してバックプロパゲーションの学習式が出せるのを導出するのをやれればなと思います。

「ディープラーニングブームは続くのか 」というLTをしました

先日あった フリーテーマプレゼン大会 in GEEKLAB.NAGANO - connpassディープラーニングブームは続くのか というLTをしました。

これはここ数年のディープラーニングブームが、もうすぐ終わるものなのか、それともまだ続いて広く使われるようになるものなのか、を予想するという内容です。

これまでのニューラルネットの歴史、ディープラーニングのブームが入ってからの発展、現在の性能、などから考えて、これは一過性のブームではない、ということを説明しています。

長野ディープラーニング同好会 #11

ディープラーニング同好会11回め開催しました。

長野ディープラーニング同好会 #11

第10回の続きで、パーセプトロンの式からバックプロパゲーションの式にというか勾配降下法でやるために、シグモイド関数に変えた場合の式を追ってそれに合わせた実装にする(バックプロパゲーションの一段目の計算式にする)というのを変更する予定でした。 が、今回また新たに来られた方々がいらしたので、再度前3回くらいの内容をざっとおさらいして、それで最後にその部分を説明する、という感じになりました。

そのため、説明がだいぶ駆け足になってしまい、正直ちょっと端折りすぎだったと思います。 前回も駆け足すぎで、みたいな反省したのに全く反省を活かせてない… みたいになってしまいました。 やはり、ちゃんと時間とってもう一度2年前にやったようなハンズオンの内容を、ある程度省略できるところは省略し、せめて1日掛けてやったほうがいいんだろうなと思います。

次回は、またcolab上でKerasを使って、もうちょっと大きなネットワークを書いて、そこでMNISTやCIFAR-10の認識などを体験する、というのを演る予定です。 また別件で、登山者をディープラーニングの画像認識使ってカウントするという件があり、それについての話し合いをする予定です。

長野ディープラーニング同好会 #10

ディープラーニング同好会10回め開催しました。

長野ディープラーニング同好会 #10

第9回の続きで、学習の概念は説明したけども、じゃあ実際の実装はどうやってるの?というのを実際に実装してもらって確認しました。
一応、パーセプトロンの主要部分となるコードを書いていただいて、MNISTの認識を試してみることができました。
この辺のサンプルコードは2年前にやったディープラーニングハンズオンのほぼそのままなのですが、こういうのは変わらないからいいですね。

ただ、手で計算してもらって、その次にそのアルゴリズムをそのままpythonで実装して…という流れの資料にしていたのを、時間なくて端折って説明してしまったので、駆け足すぎた感じになったように思います。
たぶんColabとpython説明で1時間、パーセプトロンの学習方法復習して手で学習するので1時間、パーセプトロンの実装のところ1時間という感じで時間かけるべきなんだろうと感じました。

次回はこの続きで、活性化関数をシグモイドにかえて、前々回に説明した勾配降下法を使った式に変更し、その式の出し方も少し追いながら実装してテストできればと思います。

長野ディープラーニング同好会 #9

ディープラーニング同好会9回め開催しました。

長野ディープラーニング同好会 #9

第8回に引き続きで、ニューラルネットディープラーニングそのものについての解説ということでバックプロパゲーションとはなにをしているものなのか、を説明しました。
バックプロパゲーションの基本的な考えとして、教師信号とネットワークの出力の誤差をLとするとき、その誤差Lはネットワーク全体をfとすると重みWを変数とした関数の値、L=f(W)と考えられるので、その誤差Lを減らしていくのが学習、ということをあらためて説明しました。
そう考えると、初期値のWから誤差を減らすためには、fを微分して減る方向へWを動かす、ということを模式的なグラフを書くことで、感覚的に理解してもらえるよう、説明しました。
また、入力が1つしかないような非常に簡単なニューラルネットワークを考えてみて、それが数式で書くことが出来ること、多段になってもやはり数式で書けること、それをwで偏微分できること、なんかを説明しました。

その後、CNNの基本構造について説明しました。
これは畳み込み層の話を、先祖であるネオコグニトロンの考えから、特徴を抽出するためのフィルタであると考えれば良い、ということで説明しました。

今回はちょっとだけ数式を使って説明をしたのですが、このくらいだったら大丈夫だろう、という感じだったのですが、参加されたみなさんがどう感じられたのかはわからないのでちょっと不安です。

次回はこの続きで、パーセプトロンの学習方法を再確認して、そのアルゴリズムを実装したいと思います。
また、バックプロパゲーションへの入り口として、活性化関数をシグモイドやReLUにして1段だけのパーセプトロン(活性化関数が階段関数以外のものはパーセプトロンとは呼んじゃダメなのかな?)に拡張するところまでやりたいと思います。

長野ディープラーニング同好会 #8

ちなみにもう年明けてしまって、1/7になってこのエントリ書いてます。

ディープラーニング同好会8回め開催しました。

長野ディープラーニング同好会 #8

第7回に引き続きで来ていただいた方が多く、ニューラルネットディープラーニングそのものについての解説をしたほうがよさそう、ということを考えて、急遽、以前ディープラーニングハンズオンで説明したような内容を圧縮して説明する、ということをしました。
パーセプトロンの仕組みと学習の方法、あとバックプロパゲーションにつなぐため、ネットワーク全体の重みWを変数としたときに誤差を減らしていく=学習、ということや誤差を減らすために微分して減る方向へWを動かす、ということなんかを説明させていただきました。

次回はこの続きで、多層ネットワークでも関数の組み合わせで表現可能であることから、バックプロパゲーションの手法が複雑なネットワークやBatch Normalizationのような手法でもそのまま利用できること、なんかを説明できたらいいなと思っています。

身に覚えのないDNSBL登録の理由

これは「メール Advent Calendar 2018」のために書かれたエントリです。

スパムが出てないのにDNSBLに登録されてしまう

DNSBLというDNSを用いた公開ブラックリストサービスがあります。SORBSやSpamCopあたりが有名です。
DNSBLは、正しくはスパマーの使っているbot等のIPアドレスだけが登録されているべきなのですが、誤って通常のメールサーバがDNSBLに登録されてしまう場合があります。
最近では、サブミッションスパムによりそのメールサーバから大量スパムメールが出されて、登録されてしまう場合が多いです。

しかし時々、全くそのような大量スパムメールが出されたわけではないのにDNSBLに登録されてしまう場合がありました。

そういうなにもしていないのに登録されている場合、近隣のIPでスパムを出したサーバがあったとき、IPアドレス帯でまきこまれて登録されてしまうことが多いです。

DNSBLではたいてい、そのIPアドレスブラックリストに登録されているか確認出来るようになっています。
その情報を確認すると、IPアドレス帯で登録されたわけではなく、確かにそのメールサーバから出されたメールが原因で登録されたものでした。

届いたスパムをエラーメールで返したもので登録されている

DNSBLによっては、どのメールが引き金となって登録されたのか確認出来るようになっています。

またDNSBLでは、ハニーポットという「おとり」のメールアドレスを使って、そこにメールが届いた場合、その発信元IPをブラックリストに入れてしまうものがあります。
ハニーポットのメールアドレスがスパマーにバレてしまうと、そのメールアドレスを避けて送るようにされてしまう可能性があるため、どのメールアドレスかは秘匿して運用されています。
そのため、どのメールにより登録されたかという情報は、日時を範囲にしたり、メールアドレスは一部をマスクしたりして、ハニーポットのメールアドレスがわからないように提示されています。

該当のブラックリスト登録情報を確認したところ、日時は前後5分内ということでぼかされており、メールアドレスは下記のようにマスクされていました。

dov**********************-0@************

ただ、非常に特徴的なメールアドレスだったため、ログから確認すると、宛先のスプールがいっぱいのため dovecot がエラーメールを返したものだと確定することが出来ました。

また、そのエラーメールの元となったメールのfromメールアドレスを確認すると、下記のようなメールアドレスでした。(一部マスクしています)

yvfks****+err22****139@ksulde.com

このドメインでぐぐってみたところ、下記のような日本語スパムであることがわかりました。

【本日限り】2択クイズ正解で総額1億円プレゼント
⇒ http : //ksulde.com/qow/swmc8.php?tb=****

いつもメールをお読みくださりありがとうございます。

今日は、いつも仲良くさせて頂いているGive to Win運営事務局の馬場さんから
スペシャルなプレゼント企画がある」ということで、ご案内を頂きました。
(以下略)

【誰でも1億円!】ミリオネアクイズ開催中!???: 気まぐれ日記

つまり、届いた日本語スパムをエラーメールで返したところ、それを理由としてDNSBLに登録されてしまった、ということになります。

(itochanさんのブックマークコメントいただいた件で補足追記)

このスパムは、日本語スパムでよくある、適当なドメインを大量取得して、そのドメインでWebとメールサーバとを動かしているタイプのものです。
なのでスパムに対して返信するとちゃんとメールが届くようになっています。
fromメールアドレスにはシリアル値が付加されているため、どのメールアドレスに送った返事なのかもわかるようになっていると考えられます。

スパマーDNSBLへ通報されている

そこで、なぜdovecotのエラーメールでブラックリスト登録されてしまうのか、考えてみました。

  1. エラーメールの返した先がDNSBLハニーポットだった
  2. エラーメールを受け取ったところがスパム判定してDNSBLに通報した

最初、届いていたスパムが日本語スパムだと気が付かなかったので、【1】のbotDNSBLハニーポットのメールアドレスを騙ってきているのでは、と考えました。なんていやらしいことしてくるんだ、と。

が、日本語スパムの場合、そんな手の込んだことをしてくるとは思えず、そうすると【2】のエラーメールが返ってきたものを、スパムフィルタにより自動でDNSBLへ通報してしまったのではないか、と考えました。
例えばSpamAssassinだと、スパム判定したものを自動でSpamCopにレポートするプラグインがあります。
Mail::SpamAssassin::Plugin::SpamCop - perform SpamCop reporting of messages

たぶんこちらのほうがありそうでしょう。
出会い系などの日本語スパムは、スパムに返信されてきたら人力でテンプレの返答を返して、ユーザ登録なりなんらかの振り込みをさせるよう誘導します。
でも当然大量にエラーメール等も届くはずで、それをなんらかのフィルタで選り分けている可能性は高いと思います。
そこでスパムフィルタが効いていると、自分が送ったメールの内容でスパム判定され、そのエラーメールの送り元=スパムの送り先メールサーバを自動通報してしまっている、というわけです。

非常にげんなりしてしまう話ですが、まったく身に覚えのないDNSBL登録にあったら、この可能性も考えてみるといいでしょう。