$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

雑に書いたブログ記事が問題を起こさないようにする工夫

 ちょっとしたことでも雑にブログに書いておくと良いことが起こる - $shibayu36->blog; で、ちょっとしたことでも雑にブログに書いておくと良いことが起こるよということを書いた。さらに余談として最低限の雑さについても書いた。

 これをきっかけに、公開の場でアウトプットする時の最低限の雑さとはなんだろうという疑問が自分に生まれ、雑さによる問題や、それを引き起こさないようにするための自分の工夫について少し頭がまとまってきたので、自分の考えを書いておく。

過度な雑さから生じる最大の問題

 まずあまりにも雑に公開の場に書いてしまった場合の最大の問題について考える。この時、一番起こってほしくない問題は、「読み手が誤った情報を正しい情報と信じてしまう」ことだと考えた。

 あまりにも雑な文章は読み手の誤認を引き起こし、正しい情報ではないのに正しいと読み手が解釈してしまう問題がある。正しいと解釈してシェアなどを始めると、デマが流布されてしまう。さらにこれが発展すると、デマが流布されていると気づいた人によって叩かれるということが起こり、炎上などに繋がる。単にちょっとした自分の思いとかを書いておきたかっただけなのに、それが炎上してしまい、ボコボコにされると非常に辛い。

 また誤った情報を正しいと誤認させてしまうような記事がたくさんあると、徐々にインターネットでどの情報を信用すれば良いか分からなくなるという問題もある。公開の場に出す限りはある程度の配慮が必要であろう。

 では、雑に書いたとしても、「読み手が誤った情報を正しい情報と信じてしまう」問題を起こさないために、何に気をつけると良いだろうか。

上記の問題を起こさないための自分の工夫

 「読み手が誤った情報を正しい情報と信じてしまう」問題を起こさないために、自分は次のような工夫をしていると感じた。

  • 最低限自分が正しいと思っていることを書く
  • 事実なのか考えなのか分かる書き方をする
  • 最初に前提をはっきりさせる
  • 自分の中で曖昧な部分を書くときは、そのように明示する
  • 誤解を招くような表現がないかだけ最後にチェックする

最低限自分が正しいと思っていることを書く

 書く以上は最低限自分が正しいと思っていることを書くようにしている。やはり少なくとも正しいことを書くと心がけることは大事。もちろん書いた情報が時々間違っていることもあるけど、正しいことを書こうという思いだけは持っておく必要がある。

 また、自分が正しいと思えるくらいには調べておかないと、ちょっとしたことでも雑にブログに書いておくと良いことが起こる - $shibayu36->blog; で書いたような「知識が頭の中で言語化され、定着する」という効果も得られないだろう。

事実なのか考えなのか分かる書き方をする

 自分の考えを、読み手が事実として解釈し受け止められてしまった時、かつその考えが間違っていた時に、読み手が誤った情報を正しい情報と信じてしまうことが起こる。そのため、少なくとも自分の考えを事実として解釈できてしまうような書き方をしないよう心がけている。

 考えを明示するための書き方については「理科系の作文技術 (中公新書 624)」という本に書かれていて、論理的な文章の技術を学ぶため「理科系の作文技術」を読んだ - $shibayu36->blog; にも書いたのだが、「私は〜と考える」という表現を使うのが最も簡単である。

最初に前提をはっきりさせる

 最初に記事の前提をはっきりさせることも心がけている。例えば今回だったら「雑さによる問題や、それを引き起こさないようにするための自分の工夫について少し頭がまとまってきたので、自分の考えを書いておく」がこの記事の前提だ。このように前提を書いておくことで、読者がこれは単なるこの人の考えなのだなと思いながら読むことができる。

 他にも自分の立場を明らかにするというのも有効だろう。例えばMySQLのfilesortは何ソートで行われているのか - $shibayu36->blog; の記事では、「MySQLのコードを読んだのも初めてで、しかもちゃんと読み解くことができなかった」という風に、MySQLという知識については初心者であるという立場をはっきりさせてから書いている。

自分の中で曖昧な部分を書くときは、そのように明示する

 また、雑に書こうとすると、自分の中でこれは本当に正しいか怪しいなと思う部分についても書くことがある。その部分は特に読者に誤認させたくない。

 そこで僕は自分の中でまだ曖昧な部分をメモしておくときは、きちんとその旨を明示するようにしている。例えば、「この部分はこのように解釈したが、正しいか自信がない」などの文言を追加したりする。

誤解を招くような表現がないかだけ最後にチェックする

 どれだけ書く時に気をつけても、誤解を招くような表現を無意識に使ってしまっていることがある。このような表現は書いている時には気づかないことが多い。

 そこで自分は書き終わった後に、最後に誤解を招く表現がないかだけはチェックするようにしている。誤解を招く表現というのは、自分の意見を事実のように捉えられる表現とかである。

まとめ

 今回はちょっとしたことでも雑にブログに書いておくと良いことが起こる - $shibayu36->blog; の余談である最低限の雑さから発展させ、雑に書いたブログ記事が問題を起こさないようにする自分なりの工夫について考えてみた。他にこういう問題があるのでは、こういう工夫があるのではという意見があったら知りたい。

ちょっとしたことでも雑にブログに書いておくと良いことが起こる

 僕は自分がやったこと・勉強したこと・気づいたことなどはどんなにちょっとしたことでも、公開の場のブログに書くようにしている。その内容はある程度雑でも良いので、とにかく公開の場に書くようにしている。それによって、結構良いことが起こっているというのを社内の日記に書いていたのだけど、これも公開の場に書いておいても良いかと思ったので書く。

 これまでの経験だと、次のような良いことが起こっている。

  • 最低限未来の自分に理解できる程度まで記事にまとめることで、知識が頭の中で言語化され、定着する
  • 時々他の人からフィードバックを受けて、さらに学習が進むことがある
  • 「あれ昔なんか勉強したけど覚えてないな」という時に自分のブログ見たらすぐ思い出す
  • 分からないことを調べようとググったら自分のブログが出てきてすぐ思い出す
  • 初めからブログに書くつもりでインプットすると、自然と体系化・汎化しながらインプットできるようになる
  • 自分がちょっとしたことって思っていることが、意外と他の人の参考になるということが起こる
  • 他の人が困っていて、それが自分が昔経験したことなら、ここにまとめておきましたと自分のブログからシュッと出せる
  • 記事を書き続けていると意外と読者が増えていて、気合を入れた記事を書いた時もみんなに見てもらえる
  • 徐々にフォーマットも出来てきて、アウトプットのリズムが生まれる

 雑でも良いので、自分のやったことはどんどんブログに書いておくことで、上記したような良いことが起こるので、今後も続けていきたいと思う。質より量という気持ち。

【余談】最低限の雑さ

 「雑に」と書いているけど、最低限気をつけていることがある。それは本当のことを書き、嘘や軽薄なことを書かないこと。もし正しいか分からないときは、その旨を記事の最初に書いておくこと。

 アウトプットの質はそこまで求めなくて良いとは思うが、他の人を嘘で惑わすような記事にしないようにできる限り心がけたい。

4/16 10:23追記

 最低限の雑さについてさらに考えを深めてブログに書きました。
blog.shibayu36.org

Coursera Machine Learning Week2の学習

 前回 に引き続き、Coursera Machine Learning Week 2を受講した。

 前回は線形回帰モデルとは何か、最小化すべきCost Functionは何か、最急降下法とは何かについて学ぶことができた。Week 2の講義を受けるとさらに次のことを理解することができる。

  • 多変量(x1, x2, x3, ...など変数が多数あるもの)の線形回帰をどのように考えれば良いか
  • 最急降下法のための、正規化や学習率の決め方について
  • 最急降下法でなくて、正規方程式を利用した線形回帰モデルの計算方法
  • Octaveチュートリアル

 課題もやってみたけど、行列演算を利用することで難しい方程式を一気に計算できるようになるというのが面白いところだった。以下メモを置いておく。

Multivariable Linear Regression

Multiple Features

  • 多変量の線形回帰
  • x0=1と仮定すると、多変量の予測関数は次のように表せる
    • \begin{align*}h_\theta(x) =\begin{bmatrix}\theta_0 \hspace{2em} \theta_1 \hspace{2em} ... \hspace{2em} \theta_n\end{bmatrix}\begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix}= \theta^T x\end{align*}

Gradient Descent For Multiple Variables

\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; & \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_0^{(i)}\newline \; & \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_1^{(i)} \newline \; & \theta_2 := \theta_2 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_2^{(i)} \newline & \cdots \newline \rbrace \end{align*}

なので

\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0...n}\newline \rbrace\end{align*}

x_0を1と置くことにより、全てを一括で表せるようになり、可愛い感じになった。

Gradient Descent in Practice Ⅰ - Feature Scaling

  • より収束しやすくするために、それぞれの変数を正規化する
  • -1 <= x(i) <= 1くらいなら良い
    • 経験的に -3 <= x(i) <= 3, -1/3 <= x(i) <= 1/3くらいなら許容
  • x_i := \dfrac{x_i - \mu_i}{s_i}
    • μiがxiの全ての値の平均、siがrange = (max - min)

Gradient Descent in Practice Ⅱ - Learning Rate

  • ずっとcost functionが下がり続けるLearning Rateを選ぶこと
  • Learning Rate αが小さすぎると、収束するのが遅くなる
  • Learning Rate αが大きすぎると、cost functionが減らなくなり、収束しなくなる可能性がある

Features and Polynomial Regression

  • 複数のfeatureを一つにまとめることもできる。例えばfeature1 = 縦、feature2 = 横だとしたら、featureをまとめてfeature3=面積(=縦*横)とすることもできる。
  • x_2 = x_1^2, x_3 = x_1^3と変数を定義することもできる。こうすると多項式の回帰のグラフとなる

Computing Parameter Analytically

Normal Equation

  • Normal Equation = 正規方程式
  • Normal Equationでのθ計算: \theta = (X^T X)^{-1}X^T y

Gradient DescentとNormal Equationのメリット・デメリット

Gradient Descent Normal Equation
学習率αの計算が必要 学習率の計算が不要
たくさんのiterationが必要 iterateが必要ない
計算量がO (kn^2) O (n^3)の計算量である, X^TXの転置行列計算が必要
nが多くても計算できる nが多いと遅くなる
  • n=10000を超えてくると、Normal Equationでは計算が大変になる

Octave/Matlab Tutorial

Basic Operations

  • 等しくないは ~=で表す
  • 1:0.1:2は 1から増分0.1で2まで増やした行ベクトルを表している(?)
  • histによって分布を見ることが出来る
  • help (command)でhelpを見れる

Moving Data Around

  • loadとsaveでファイルの入出力

Plotting Data

  • plot系
  • imagesc(A), colorbar, colormap gray;

Vectorization

  • forループをベクトルの掛け算に変換することで、簡単にかつ高速に演算できる