Going Faraway

渡辺遼遠の雑記帳

ジャレド・ダイアモンドによる宗教の定義まとめ

上記記事の反応で、宗教の定義が無いというコメントがあったので。

ジャレド・ダイアモンドの「昨日までの世界」の宗教に関する議論の中で、宗教の定義が16件挙げられています。

 

1. 超人的な支配力に対する人間の認識であり、とくに服従の対象となる個人的な崇拝の対象についての認識である(Consice Oxford Dictionary)

2. 信念もしくは崇拝についての特定の体系であり、しばしば倫理規範や一種の哲学を含む(Webster's New World Dictionary)

3. 物体、人物、不可視のもの、あるいは超越的存在、神聖、天与、上智についての思想体系に関連した、信念や考え方とともにする集団を基盤とした社会的一体性を持つ体系。さらに、倫理規範と慣習、価値観、慣例、伝統、および信仰や思想体系に関連した儀礼に関連した信念や考え方をともにする(Wikipedia

4. もし私たちが、宗教生活をできるだけ広い、もっとも一般的な言葉で特徴付けるようにもとめられるならば、宗教生活は、見えない秩序が存在しているという信仰、および、私たちの最高然はこの秩序に私たちが調和し順応することにあるという信仰から成り立つ、と答えることができよう(ウィリアム・ジェイムズ

5. 存在すると認められるべき一つの超自然的行為主体、ないし、いくつかの超自然的行為主体を信じている人々からなる、一つの社会システムである(ダニエル・デネット

6. 自然の運行と人間の生命の動きに命令しそれを支配すると信ぜられる超人間的な象徴の力に対する宥和または慰撫に他ならない(ジェームズ・フレイザー

7. 自分自身の存在の究極の条件と人とを結びつける象徴的な様式もしくは行為(ロバート・ベラー)

8. 社会の「究極の懸案事項」に向けられた信念や慣習の体系(ウィリアム・レッサとイーボン・ボート)

9. 万物の分類を研究する人間を支援あるいは疎外する超人的存在とその力への信念であり、この信念があらゆる宗教の定義で表現されるべき核となる変数であると私は強く主張する。……私は「宗教」を「文化的に前提とされた超人的存在との、文化的にパターン化された相互作用からなる制度」と定義しよう(メルフォード・スパイロ

10. 文化横断的に共通する宗教の要素は、不可視の規則と数々の象徴の組み合わせによって定義される最高の幸福である。この象徴は、不可視の規則と調和して生活するための個人や集団の秩序化を支援するものであり、調和を達成しようとする感情的貢献を支援するものである(ウィリアム・アイアンズ)

11. 宗教とは、神聖すなわち分離され禁止された事物と関連する信念と行事の連帯的な体系、教会と呼ばれる同じ道徳的共同社会に、これに帰依するすべてのものを結合させる信念と行事である(エミール・デュルケーム

12. 大雑把にいって、宗教とは、死や幻想といった人間の存在上の苦悩を超越した、事実や直感に反する超越的存在の力や、超越的存在に対する犠牲が大きく破りにくい約束を共同体がすることである(スコット・アトラン)

13. 宗教とは、一般的な存在の秩序の概念を形成し、また、これらのの概念を事実性の層をもっておおうことによって、人間の中に強力な、浸透的な、永続的な情調と動機づけを打ち立たせ、情調と動機づけが、独特、現実性をもつようにみえるように働く、象徴の体系である(クリフォード・ギアツ

14. 宗教とは、神話を創造して普及させるため、さらに利他の精神を相互に発揮させるため、そして共同体の成員間でそれぞれの利他と協力の精神の度合いを知らしめるために、人間文化の不可欠な機序として進化した社会的慣習である(マイケル・シャーマー

15. 宗教とは、信仰と習慣と制度が一組になったものであり、人間がさまざまな社会で進化させてきたものである、と定義する。(タルコット・パーソンズ

16. 宗教は追いつめられた生き物のため息であり、非常な世界の情であるとともに、霊なき状態の霊でもある。それは人民の阿片である(カール・マルクス

ダイアモンドは、以上16件の定義を踏まえた上で、宗教の特徴を以下5つにまとめています。

1. 超越的存在についての信念の存在
2. 信者が形成する社会的集団の存在
3. 信仰にもとづく活動の証の存在
4. 個人の行動の規範となる実践的な教義の存在
5. 超越的存在の力が働き、世俗生活に影響をおよぼしうるという信念の存在

なお、「一つ二つの要素が欠落するからといって、その事象を非宗教的と決めつけることも意味をなさない」と注意を述べています。 

この手の定義を見て少し不思議だなぁと思うのは、死後の来世のあり方、あるいは現世における永遠の生命について直接的に述べる人が少ないことです。(おそらく 1. の「超越的存在」に含まれるのでしょうけど) 

私自身は「世俗と宗教」を分けることにそんなに意味はないと思っているのですが、宗教の特徴を整理してみると、以下の5つになると思います。

  1.  超越的存在への信念
    ここで言う「超越的な存在」は、神や霊かもしれませんし、仏教の「輪廻転生とカルマの法則」、「収穫加速の法則」のような抽象的法則の類いかもしれません。また、 ここで言う超越的存在には、自分自身や近親者の死後のあり方、来世や永遠の生命についての語りを含む場合が多いです。
  2. コミュニティ
    人間は放っておくと (世俗的なものも含む) 集団を作るので、それほど重要な要素でもないかも… と思います。
  3. 儀式、儀礼
    ここで言う「儀式や儀礼」は、「実際的・実利的な意味から切り離された活動」を意味します。「感染症を防ぐため衛生的に死体を処理する」のではなく「遺体に何らかの言葉を唱えた上で墓地に埋葬する」、「特に読んでない科学記事をリツイートする」という感じです。
  4. 道徳的な掟や価値判断の基準
    義務や禁止事項、善悪の基準など。
  5. 超越的存在の力が及ぼす世俗世界への影響の信念
    「先祖の霊が祟る」、「科学技術の進歩は自然法則」といった信念があります。

この観点から言えば、クライオニクス、マインドアップローディングや劇的な寿命延長などのフリンジサイエンス的信念・実践による永遠の生命への希望を含めた、広い意味でのシンギュラリタリアニズム/トランスヒューマニズムは、やはり宗教であると思います。

【Deep Learning with Python】畳み込みニューラルネット(CNN)の説明

前回は、畳み込みニューラルネットワーク (Convolution Neural Network; CNN) のサンプルコードを動作させてみた。もはやググればいくらでも説明が見つかるので特に説明の必要もないかと思ったけど、ここではCNNの構成要素についての説明を簡単にまとめる。

畳み込み

「畳み込み」という処理は、画像処理で言えばおおむね「フィルタリング」に当たる。画像上の一部分を切り出し、これを1つの特徴量として圧縮 (=畳み込み) する。畳み込みの操作は、切り出した小領域と「フィルタ」を演算 (内積) することで行なわれ、このフィルタの形状によって画像の「特徴量抽出」ができる。

f:id:liaoyuan:20180327234210p:plain

この図5.3 は3x3のフィルタをMNIST画像サンプルに適応してみた例。右下がりの斜めの線に強く反応しているようだ。CNNではフィルタの形状(畳み込み係数)自体も学習できるので、さまざまなフィルタが作られ、画像の特徴量を抽出できる、ということらしい。

パディング

f:id:liaoyuan:20180327234334p:plain

たとえば、上図の例のように5x5ピクセルの画像から3x3の小領域を切り出した場合、合計で9つの小領域しか作れない。この場合、作成される特徴量マップは3x3に縮小されてしまう。これを防ぐために、元の5x5の画像の周囲に1x1のダミーのピクセルを追加(=パディング)し、出力される特徴量マップが元画像と同じ5x5のサイズとなるようにする処理を行なう。

f:id:liaoyuan:20180327234434p:plain

素人考えだと、次のプーリング層でどうせサイズが縮小されるのだから、特徴量マップが縮小されてもあまり気にしなくても良いんじゃないか… と思ってしまうけど、たぶん画像の隅にある情報を取りこぼさないためのものなんじゃないかと思う。

KerasのConv2Dレイヤーでは、引数"padding" を指定するとパディングをするかどうかを選択できる。なお、デフォルトではパディング処理を行なわない。

マックスプーリング

先のCNNのサンプルでは、畳み込みの処理を行なった後、マックスプーリング層で特徴量マップを半分のサイズにダウンスケールした。このプーリングの処理が必要な理由は次の2点である。

  • 畳み込みを繰り返すと、特徴量の空間的な階層性を学習させることが困難になる
  • ダウンスケールしないと、次元数が大きくなりすぎるため過学習が起こりやすくなる

本書では書かれていないけど、画像の平行移動・回転に対するロバストネスを向上させるためという説明もされることも多いみたい。

プーリング層では、特徴量マップからある一部分の領域を切り出し、そのうちの最大値を取り出すマックスプーリングが使われることが多い。ただし、プーリングの処理はマックスプーリングに限らない。切り出した小領域の平均値を取るアベレージプーリングという処理もある。ただし、マックスプーリングは他のプーリング処理よりもうまく働くことが多い。端的に言えば、特徴量は特徴量マップ上の異なるタイル上にあるパターンの空間的配置によって表される傾向があるためである。

コード

KerasでのCNNのモデル作成方法は以下のコードの通り。(このコード自体は前回の再掲)

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

書評:テレビ芸人としてのトランプ『炎と怒り』

私を昔から知っている人は、たぶん、私がちょっとしたトランプウォッチャーだということを知っていると思う。私の好きなアメリカ人ブロガーが2016年1月にトランプの当選を完璧に予測していたこともあり、大統領選挙予備選の早い段階から今日に至るまで、この奇異なセレブの言動に少しばかり注目していた。

そういうわけで、話題のトランプ暴露本『炎と怒り』を読んだ。

炎と怒り――トランプ政権の内幕

炎と怒り――トランプ政権の内幕

内容については、いろいろな人が言っているけど「重大な衝撃の新事実」といった情報は多くない。たぶん、トランプ本人のツイートとリーク、新聞などを少し追っていれば、すでにどこかで聞いたことがある情報も多いと思う。それでも、語り口は軽妙でまとまっているので、改めて笑いと恐怖を感じながら非常に面白く読めた。

時系列的には、大統領選挙投票日の少し前から、スティーブ・バノンの解任 (2017年8月) ごろまでを扱っている。

特に面白いのが、トランプ自身も含めて選挙スタッフの誰もがトランプが当選するとは信じていなかったということで、大統領選挙への出馬は単なるパブリシティだったという。元安全保障担当補佐官だったマイケル・フリンがロシアとの接触を全く懸念していなかったのも、どうせ選挙で負けるから問題になることはないと思っていたからなのだそうだ。

「ところで、大統領になりたいんですか?」とナンバーグはトランプに尋ねた(普通なら「なぜ大統領になりたいのですか?」と問うところだが、それとはずいぶんとニュアンスの違う質問だった)。トランプからの返事はなかった。
(Kindle版loc. No.354-356)

(開票の時の様子を) トランプ・ジュニアが友人に語ったところでは、DJT(ジュニアは父親をそう呼んでいた)は幽霊を見たような顔をしていたという。トランプから敗北を固く約束されていたメラニアは涙していた--もちろん、うれし涙などではなかった。
(Kindle loc. No.543-545)

そんな状態で、誰一人として当選を予期しておらず、トランプは政治の知識も人脈も興味もなかったので、当選後の移行期間も就任後もめちゃくちゃなカオス状態であった。元下院議長であるジョン・ベイナー議員を主席補佐官に推薦されたとき、トランプは「誰だって?」と聞き返したのだそうだ。

そして、トランプの周囲で、政治的なバックグラウンドも支持者も全く異なる人々、トランプの身内 (特に、「ジャーバンカ」と蔑称されるジャレド・クシュナーとイヴァンカ)、ポピュリストの扇動者スティーブ・バノン、そして共和党と軍・官僚のエスタブリッシュメントの三派が、ドロドロの権力闘争を繰り広げていく様子が描かれていくが、ワンマンで気分屋のトランプに周囲の人は振り回され、ほとんど彼のの気分次第で重用されたり遠ざけられたりしてしまう。なにせ、トランプ本人ですら自分の好みを理解しておらず思い付きで物を言い(しばしば最後に会話した人に影響を受けるのだという)、そのくせ自身の判断力には絶対的な自信を持っているのだから始末に終えない。

 本書の信頼性について

一応言っておくと、本書ではトランプ本人に関する暴露話や周囲の人間のエピソードがふんだんに取り上げられているものの、信頼性についてはやや疑問があるようで、本国では「東スポ日刊ゲンダイのレベルのゴシップ本」という評価もあり、また単純な事実誤認を指摘されていたりもする。

私も本書を読んでいて、あまりにも自分で見てきたような、聞いてきたような記述がされている上、物語めいた巧みな語り口や過剰なまでの修飾に、臨場感を感じるよりもむしろ鼻白むことも多かった。それでも、ベースになった事実としてはおそらく正しく、一種の風刺としてキャラクターの特徴を捉えているのではないかと思う。

テレビ芸人としてのトランプ

読んでいるうちに考えたたのは、ドナルド・トランプの本質はテレビ芸人なのではないかということ。

選挙出馬前、トランプは8年間『アプレンティス』というリアリティーショーのホストを務めている。市井の人々が何を望み、何を聞きたがっているのかに対する本能的な嗅覚は、おそらくTVの中で培われたものなのではないかと思う。

そして、テレビで人気を集め高い視聴率を得るためには、必ずしも万人から好かれる必要はないし、極論すれば正しいことを言ったり行ったりする必要すらない。たとえ誰かから嫌われていようとも、常に話題を提供し続け、話題の中心に居ること、そして自分のコアな支持層を掴み続けていくことが肝要である。そうすれば、仮に国内のほとんどを敵に回したとしても、コア層は支持を続け、敵対者から自分を守り続けてくれるだろう。

まだこの先約6年半、トランプ劇場からは目が離せなさそうだ。

合わせて読みたい

私は、トランプ氏本人はちょっとした「事故」のようなものだと思っているけど、彼を大統領に押し上げた潮流は本物のもので、今でも解決しておらず、今後の世界を形作っていくものだと思う。そういった視点から、等身大のトランプ支持者を取り上げた本としては『ルポ トランプ王国』が、もう少し広い歴史・思想的な視野からトランプ現象を論じた本としては『破綻するアメリカ』(本サイト書評) が面白かった。

翻訳添削:シリコンバレーのシンギュラリティ大学はいくつかの深刻な現実の問題を抱えている

twitterで「シンギュラリティ」を検索していたら見かけた以下の記事について。

元記事はシンギュラリティというホラを口にして金儲けをする人間の欺瞞が暴き出されておりとても面白いもので、是非読んでほしいのですが、こちらの翻訳はまだ改善の余地が残っていると思うので、私も訳し直してみました。翻訳を添削する過程で、私が翻訳をする際に何を考えながら訳しているのか説明してみたいと思います。

私の訳文についても、完璧だともこなれているとも考えていないので、他の方からのツッコミも歓迎します。(特に私は経済・法律関係は弱いので誤訳があるかもしれません)*1


まず全体的に、この文章での"Singularity"は、「技術的特異点」の意味ではなく、シンギュラリティ大学のことを指しています。

 

It’s lost Google funding and dealt with allegations of assault and fraud.

 Googleが資金調達を失ったのではなく、シンギュラリティ大学がGoogleからの資金を失ったことを意味しています。また、"deal with 〜" は、「〜に対応する、対処する」の意味。

The pitch was simple:

"pitch"には口語で「売り口上、宣伝文句」といった意味があります。

Forget accredited graduate schools and think big at Singularity University

"at Singularity University" は、目的語ではなく、場所を表す前置詞句。全体として、「シンギュラリティ大学で大きく(大きなことを)考えよう」という意味になります。

Google co-founder Larry Page and futurist Ray Kurzweil could be among your lecturers in the Graduate Studies Program at Singularity

この"could"を簡潔に訳すのは難しいのですが、「ひょっとするとカーツワイルやペイジのようなビッグネームが、あなたの講師になるかもしれませんよ (居ないかもしれないけどね)」というニュアンスがあります。なので、「はずです」という表現だとちょっと強すぎるように思います。

Previously unreported police files, other documents, and interviews with current and former students and staff paint the picture that almost from the beginning, some Singularity staffers weren’t able to curb their worst impulses.

(拙訳) 過去の未公開警察資料、他の文書、そして現在と過去の生徒と職員に対するインタビューによって、ほとんど開校直後から、シンギュラリティ大学の何名かのスタッフは自身の最悪の衝動を抑えることができなかったと暴露されている。

無生物主語文の主語を条件、手段、副詞っぽく訳すテクニックはわりと頻繁に使います。
"The medicine will make you feel better"
「薬があなたの気分を良くするだろう」→「薬によって(薬を飲めば)、あなたは気分が良くなるだろう」

"former and current"は、"students and staff" の両方を修飾します。つまり、「元生徒と現生徒、元スタッフと現スタッフ」を意味します。ただし、元の文章自体があいまいで厳密に訳す必要もないので、訳文にも曖昧さを引き継いだ形で訳しています。
細かいことですが、並置された語に対する訳語の品詞は、日本語でも合わせた方が良いです。つまり「現在と元生徒」ではなく「現在と過去の生徒」ないしは「現生徒と元生徒」という訳が良いと思います。

"paint the picture" は、文字通り「絵を描く」の意味もありますが、ここでは「状況を説明する」 という意味のイディオム。日本語でも「描写する」「描き出す」という言葉が、絵を描くことではなく、比喩的に「説明する」という意味で使われることがあるように。ここではやや意訳気味に、「暴露する(される)」と訳してみました。

ここから、「これらの資料が犯罪行為の図式を描いている」→「これらの資料によって、犯罪行為が暴露されている」と訳しています。

A teacher allegedly sexually assaulted a former student, an executive stole more than $15,000, a former staffer alleges gender and disability discrimination,

(拙訳) 講師は元生徒に対する性的暴行容疑を訴えられ、役員は15000ドル以上を横領し、元職員は性差別と障害者差別を訴えている。

ここは名詞句の並列ではなく、複数の文が並置されたものです。つまり、「〜の講師、〜の重役、〜の職員」という意味ではなく「講師は訴えられ、役員は盗み、職員はセクハラを訴えている」という文が並べられた形になります。

"gender discrimination"は「性差別」。ここでは、"(gender and disability) discrimination" で、「性」と「障害」が等位で並置されdiscriminationを修飾しています。「性(ジェンダー)と障害者差別を訴えている」では意味が通りづらいので、若干冗長になるものの漢字の熟語をそのまま使い「性差別と障害者差別」と訳すか、もしくは「性別と障害による差別」と訳したほうが良いかと。

and Singularity dismissed 14 of about 170 staffers and suspended GSP, now called the Global Solutions Program, after Google withdrew funding last year.

(拙訳) そして、シンギュラリティ大学は170名の職員のうち14人を解雇し、GSP、現在の呼び方はグローバルソリューションプログラムを中断した。それは昨年Googleが資金提供を終了した後のことである。

"dissmissed"と"suspended" の主語は、両方ともSingularityです。GSPはGoogleではなくシンギュラリティ大学が主催するプログラムであり、GSPを中断した主体もシンギュラリティ大学です。

Alumni say for-profit Singularity is becoming just another organizer of conferences and executive seminars.

(拙訳) 営利目的のシンギュラリティ大学は、カンファレンスとエグゼクティブセミナーを行う平凡なオーガナイザーになりつつある、と卒業生は述べている。

"Alumini"は、同窓生の意味もありますが、ここでは「卒業生」を指す。

"just another 〜"はイディオムで、「平凡な、ありふれた」という意味があります。当初、シンギュラリティ大学は高い理想を掲げていたにもかかわらず、今では有料セミナーや有料カンファレンスを主催して金儲けする企業になってしまった。類似のセミナー企業は既に多数存在しているのに…といった程度の意味です。

“It’s become a moneymaking corporation.”

"moneymaking company"は、ニセ金作りをする会社…ではなく、もちろん金儲け(にしか興味がない)会社の意味です。

 

以下、ざっと訳しにくいところだけ説明。

 He reminded her he was a doctor, 

(拙訳) 彼は自分が医者であることをほのめかし、

英語としては何ということもない平凡で簡単な文ですが、日本語に訳すには少し考える必要がある文。直訳すれば、「彼は彼女に彼は医者であると思い出させた」ですが、これではあまりに日本語としてこなれていないのでこんな訳文に。

a Singularity human resources official told her Nail believed “the facts around the central allegation of unwanted sexual touching are inconclusive”

(拙訳) シンギュラリティ大学の人事代表者は、「意に沿わない性的接触の核心的な主張に関連する事実は、確定的なものではない」とNailは信じている、と書いた。

元の文章自体がかなりあいまいに書かれているので、訳文も分かりにくいですね。要するに、シンギュラリティ大学は「強制わいせつの客観的証拠は無いだろう」と主張しているということです。

 

The email outlined steps Singularity was taking to reduce the likelihood of staffers being in “potentially intimate situations” on campus,

intimateは、「親密な」という意味ですが、性的な意味での親密さを含意します。

she also kept the cash from a $2,000 check to Singularity, according to a subsequent police report. 

(拙訳) また、後の警察報告によれば、彼女は2000ドルの現金をシンギュラリティ大学に対する小切手から引き出したとされている。

checkは小切手の意味。ここはちょっと細かいニュアンスが分からなかったので、私も誤訳しているかもしれません。

He appealed a $247 million judgment and ultimately settled.

(拙訳) 彼は2億4700万ドルの判定を訴え、最終的には和解した。」

appealには、カタカナの「アピール」と同様の意味もありますが、ここでは「訴訟をする」「上告する」という意味で使われています。「インサイダー取引で彼が告訴された」のではなく、「彼が告訴した」となっている理由はちょっと不明ですが、2億4700万ドルの異議申立をした、という意味だろうと思います。

Eleanor Schuermann, a lawyer at Kastner Kim LLP, is representing a staffer who alleges Singularity discriminated against her because of her gender and disability, paid her less than men in the same position, and retaliated against her for complaining.

LLP (Limited Liability Partnership) は「有限責任パートナーシップ」のことで、弁護士やコンサルタントのように、独立性の高い専門職の人間が集まって仕事をする組合で、共同で一定範囲の責任は負うものの、他パートナーの不法行為に対する責任を終わない法人の形、だそうです。弁護士事務所みたいな感じなんでしょうか。

representも訳の難しい語。原義では、re(再び)+present(提示する)で、ここから「代表、代理する」、「議員である(になる)」、「象徴する」、「言う、示す」、「表現する」などの意味を持ちます。ここでは、性差別と障害者差別を訴えている元職員の訴訟の代理人を務める、という意味。

“We’re nowhere near impacting the billion people our students talk about.”

"nowhere near A" はイディオムで、「Aからほど遠い」の意味。

 

私の訳全文はプロジェクトブログに掲載しています。


そして、翻訳をする際の注意点というかアドバイスを述べておくなら、

  • 多義語、イディオム、特別な意味を持つ構文は辞書で確認する。
  • 文章構造をきちんと取る。特に最初は5文型と等位接続詞に注意する。
  • 訳しにくい構文を日本語に訳すテクニックはある程度整理されているので知っておくと良い。

 しばらく前に名著と言われれる『英文翻訳術』を読んだのですが、学校文法から繋がる形で英語を自然な日本語に訳すテクニックが解説されていて参考になりました。

英文翻訳術 (ちくま学芸文庫)

英文翻訳術 (ちくま学芸文庫)

 

英語の構文を捉えるという観点だと、私が10数年前の受験で使った参考書ですが伊藤和夫氏の本は良かったです。

ビジュアル英文解釈 (Part1) (駿台レクチャーシリーズ)

ビジュアル英文解釈 (Part1) (駿台レクチャーシリーズ)

英文解釈教室〈新装版〉

英文解釈教室〈新装版〉

 

*1:ちなみに、私自身は一番真剣に英語を勉強したのは約10年前の大学受験の頃で、下訳のバイトなどを何件かやったことはありますが職業的に翻訳をしたことはなく、過去にも現在にも特に語学に関わる職業に就いたことはありません

Bashでパイプされたコマンドの出力を変数に割り当て、同時に戻り値を調べる方法

ぐぐってもあまり情報が出てこなかったのでメモ。

Bashで 「$?」を使えば実行したコマンドの戻り値が取得できるのは有名。

$ false; echo $?
1 # falseの戻り値

Bashの場合、パイプされたコマンドの戻り値は 「PIPESTATUS」という配列に格納されることも、それなりに知られていると思う。

$ true | true | false
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
0 0 1 # true, true, falseの戻り値

ところが、バッククオートや 「$()」 によるコマンド置換の中で複数のコマンドをパイプし、その出力を何らかの変数に割り当て、かつ戻り値を調べようとするとうまく行かない。

RESULT=$( some_command | false | true )
echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
0 # 最後のtrueの戻り値
RESULT=$( some_command | false | true | false )
echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
1 # 最後のfalseの戻り値

上記の通り、コマンド置換中の最後のコマンドの戻り値以外は取得できない。
これは、コマンド置換がサブシェルを作成するものであり、PIPESTATUS 配列はそのサブシェル (コマンド置換内) でしか使用できないために起こるのだそうだ。

コマンド置換内のコマンドのうち、1件のみ (今の例ではsome_command) の戻り値が知りたいだけであれば、コマンド置換の中で exit statusを返してやれば良い。

RESULT=$( some_command | false | true | false; exit ${PIPESTATUS[0]} )
echo $?
0 # some_command の戻り値

【Deep Learning with Python】畳み込みニューラルネット(CNN)によるMNIST

Kerasの作者、フランソワ・ショレ氏によるディープラーニングとKerasの解説本 『Deep Learning with Python』の読書メモ。

第二部「Deep Learning in practice」では、実践的な問題にディープラーニングを適用する方法を扱う。5章は畳み込みニューラルネット(convolutional neural network; CNN, convnet) を用いたコンピュータビジョンに関する話。

理論的な話は後で出てくるので、とりあえずCNNのサンプルプログラムを動かす。最初にも出てきたMNISTデータセットを使って、画像の分類を行う。

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

Conv2D と MaxPooling の層が交互に置かれる形になる。

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))

Conv2Dの最初の引数"32"はフィルタ(カーネル)の数を表し、出力の次元となる。次のタプル "(3, 3)" はフィルタ(カーネル)のサイズを表し、ここでは幅と高さが3x3のフィルタを用いることを意味している。

model.add(layers.MaxPooling2D((2, 2)))

MaxPooling層では出力をダウンスケールする。ここでは、前の畳み込み層の出力が幅と高さ方向にそれぞれ半分にされることを意味する。(畳み込み層とマックスプーリング層の処理の詳細は、後の節で解説があるので後述)

>>> model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 13, 13, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 11, 11, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 3, 3, 64)          36928     
=================================================================
Total params: 55,744
Trainable params: 55,744
Non-trainable params: 0
_________________________________________________________________

model.summary() 関数でモデルの概要を出力することができる。Output Shapeの列に注目すると、conv2dの層で「畳み込み」が行なわれ、max_pooling層で出力が半分に落とされていることが分かる。

# 予測用のレイヤー
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

予測用のレイヤーを追加する。畳み込み&マックスプーリング層の出力は3x3x64次元のテンソルなので、layers.Flatten() を使って576個の要素を持つ1次元のベクトルに変換し、全結合層を使い、その出力から予測を行う。

# 訓練データの変換
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

訓練データをニューラルネットへの入力用に変換する。最初の全結合ネットワークを用いたサンプルでは、画像データを1次元ベクトルに変換した。

train_images = train_images.reshape((60000, 28, 28, 1))

今回の畳み込みニューラルネットでは、2次元のデータのまま入力する。 reshapeの引数のタプル "(60000, 28, 28, 1)" は、それぞれ、(データの数, 縦のピクセル数、横のピクセル数、チャネル) を表す。MNISTのデータは、0〜255の数値で表現されるグレースケールなので、今回のチャネル数は1となる。たとえば、RGBの3つの数で表現されるカラー画像の場合、チャネル数は3となるとか。

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5, batch_size=64)

モデルをコンパイルして学習を行う。モデルがちょっと複雑になってきたためか、学習に多少時間を要する。GPUを使わない環境で実行したら、学習の1エポックに2〜3分程度掛かった。

>>> test_loss, test_acc = model.evaluate(test_images, test_labels)
>>> print(test_acc)

10000/10000 [==============================] - 3s 339us/step
0.9915

テスト誤差を測定してみると、99.15%だった。もっとカリカリにチューニングすれば99.5%程度まで向上させられるらしい。

予測と結果の表示

最初のサンプルと同様、結果を表示してみる。左上の青文字が正解のラベルで、赤字がニューラルネットの予測値 (誤答)

f:id:liaoyuan:20180224123428p:plain

最初の全結合ネットワークの結果よりも、更に乱雑で人間が見ても間違いそうなものが多い。それでも、8, 9の混同など、人間だったらこんな間違いはしないだろうという間違いも残っているようだ。

【Deep Learning with Python】ドロップアウト

フランソワ・ショレさんのディープラーニングとKerasの解説本『Deep Learning with Python』の読書メモ。今回で前半部分の第1部は終わり。ここでは、前回に引き続いて正則化の手法のドロップアウトを扱う。

ドロップアウトは、ニューラルネットに対して最も有効であり、最も広く使われる正則化手法で、ニューラルネットの「ゴッドファーザートロント大学のジェフ・ヒントン教授とその教え子によって開発された。ドロップアウトはどのような手法かというと、モデルの訓練時に一定の割合のノードの出力をゼロにする (値をドロップアウトする) というもの。この手法により、過学習を緩和して、汎化性能を向上させることができる。

ヒントン先生がドロップアウトの手法を考案したきっかけについて、本書では本人が語った面白いエピソードが紹介されている。

「私は銀行へ行った。窓口の行員は交代し続けており、私は彼らに何故なのかと聞いた。行員は、自分には分からないと言ったが、彼らはたくさん動き回っていた。私は、窓口係の交代で従業員同士の協力が必要となることによって、銀行詐欺を防げるからに違いないと考えた。」

窓口での顧客対応を、わざわざ複数人で行うのは一見非効率だと思える。しかし、あえて情報共有を必要とする状況を作ると、その過程で意味のない情報は捨てられることになる。そうすることで本質的な情報に対する注意が向けられ、銀行詐欺のような異常事態に気付くことができるのではないか、と言うことなのだろう。

ニューラルネットに対するドロップアウトがうまく働く理由も、これと似ていると言われている。訓練データの偏りによって生じた意味のないパターン (ヒントンが共謀(conspiracies)と呼ぶもの) は、わざとランダムなノイズを入れることでかき消すことができる。そのため、訓練データに含まれる本当に重要な意味のある情報のみが残される。


Kerasでドロップアウトを使う場合には、モデルにドロップアウト用のレイヤーを追加するという形を取る。

dropout_model.add(layers.Dropout(0.5))

ここでDropoutインスタンスに指定している引数 "0.5"はドロップアウト率を表す。ここでは、直前の層からの入力のうち50%がランダムに間引かれ、値がゼロとなることを意味する。

IMDBサンプルのモデルにドロップアウト層を追加したモデルは以下の通り。

dropout_model = models.Sequential()
dropout_model.add(layers.Dense(16, activation='relu', 
                                  input_shape=(10000,)))
dropout_model.add(layers.Dropout(0.5))
dropout_model.add(layers.Dense(16, activation='relu'))
dropout_model.add(layers.Dropout(0.5))
dropout_model.add(layers.Dense(1, activation='sigmoid'))

このモデルは、IMDBサンプル問題で使用したオリジナルのモデルにドロップアウトを足しただけのもの。
訓練時のパラメータは全て同じものを使い、検証誤差を比較したものがこちら。

f:id:liaoyuan:20180219195539p:plain

確かに、過学習が緩和されていることが分かる。