Lahの部屋

落書き帳です。見たい人は見てください。

言語活動としての倫理的判断

 倫理学の書籍を読んでいると、どうも、「倫理」というものが特別視されすぎているという印象を受ける。倫理的判断は何ら特別な哲学的判断なのではなく、普通の言語活動の一環だと思っている。そういう視点からメタ倫理学的な考え事を書いていきたい。メタ倫理学と呼ぶことすら仰々しい。そう呼ばれているものの一部は、単に言語活動一般として分析されれば事足りるのではないか。

 

 倫理的判断ないし倫理的な発言とは、「善い」「悪い」「すべき」「それはダメでしょ」等の語群を使う発言だといえる。これらを「倫理的語彙」と呼ぼう。我々の倫理的判断の根拠や源泉をあたるためには、それら倫理的語彙の学習過程に着目する必要がある。我々は、倫理的語彙やその使用をどのように学んできたか?

 

 私たちは、倫理的語彙の意味を教えられた後にその用例を学んだ、のではないはずだ(そういう言語化ができないことは、ムーアが「自然主義的誤謬」の名で示している)。実のところ、ある出来事とそれら倫理的語彙が使用されている場面とが一挙に、言語学習過程の我々に与えられてきたはずだ。つまり、それら倫理的語彙は、それらが言及しようとしている事例とともに示されるのが常であった。

 

 そのとき、我々は単に語彙が使用されているのを見るだけであり、それが倫理的発言であるということすら明示されない。片付けをした直後に「えらいね」と発話され、別の園児を叩いた子に対し「ダメ」と発話される。そのような場面を幾度となく経験することで、私たちは「善い」「悪い」という語がそれぞれどんな場面に似つかわしいかを感じ取っていく。これが倫理的語彙、ひいては倫理の学習における実際の姿ではないだろうか。

 

 このような学習は幼少期のみに見られるわけではない。我々は幼少期のうちに倫理的語彙を「学び終わる」のではないのだ。それら語彙は日常の言語活動において絶えず用いられ、事例は常に蓄積されていく。

 

 そのような学習と同時に我々も、他の人の真似をして倫理的判断を下していく。ある種の場面や言動に対して、倫理的語彙を使うのだ。ここで考慮されるのは、類似する過去事例の存在と、そこで発揮された語彙の効力である。盗みを働こうとする人に対して「よくないよ」と発言することは、単に自然な発言だったというだけでなく、その盗みを抑止する効果も発揮してきたはずだ。私たちは、その語がその場に適合することを確信しつつ、その語彙が放つ効力にも期待して、その語を発するのである。中には「倫理的判断が難しい事柄」というものもあるが、それは類似する過去事例の不足を主張しているに過ぎない。

 

 これが、倫理的判断がどのように下されているか、の現状だ。では、この説明によってメタ倫理学の探究に終止符が打たれるのかというと、それは全く違う。世の中であまり明示されないが、メタ倫理学はふたつのことを探求していると私は考えている。①我々は現状どのように倫理的判断を下しているのか、と、②我々は理想的にはどのように倫理的判断を下すべきなのか、である。今回述べたのは①に対する回答にすぎず、そこでの自分の立場を整理したものだ。今後は②についても何か言えたらいいなと思っている。

 

【自分用】テキスト変換装置

はてなブログからローカルへの移植のためのちょっとした変換装置を作った。

トランスエイジからトランスジェンダーを考える

 最近、トランスエイジという概念が注目を集めている。トランスエイジとは、身体の年齢(戸籍上の年齢)と自認する年齢が異なる状態のことだ。トランスジェンダーが比較的世間から受け入れられつつあるのに対して、トランスエイジ概念はかなり批判を浴びているみたい。まあいろいろ言われているが、僕たち(年齢違和を感じるか否かにかかわらず)が問うべきことはひとつだ。


 僕たちはトランスエイジという概念を認めるべきなのか?


 そもそもだけど、新しい概念が提唱されているわけだ。既存観念では十分でなく、トランスエイジ概念が必要だとされた理由があるはずだ。ここで、オッカムの剃刀を応用した考え方をする。トランスエイジという概念を使用せずしてその問題を解決できるんなら、そのほうがシンプルでいいはず、ということだ。


 本来であれば、そのあたりを踏まえて、トランスエイジ概念の必要性についてみんなで議論しよう!という話になる。でもここで問題がある。トランスエイジ概念の必要性は、年齢についての違和を感じる人間にしか経験できない、という壁だ。民族や宗教の問題においてもそうだけど、万人が経験できないということは対話において分断を生んでしまう。そして、対話ができないことをいいことに、雑多な概念が乱立してしまうこともある。もどかしいね。


 現時点でトランスエイジについてこれ以上の深掘りは難しそう。  むしろこれを機に、すでに世間から認識されているトランスジェンダーについてもう一度考えてみたい。


 トランスジェンダーとは、狭義には、身体性と性自認が異なる状態のこと。ここで重要なのは性自認という概念だな。ある見方をすれば、性自認とは、自分の望む扱われ方を性別の名で呼んだもののことだといえる。つまりそれは、性別によって扱われ方が変わるという前提に基づいている。ということは、世間が性別に関係なく人間を扱うようになってしまったら、性自認概念は根底から揺さぶられる。不思議な構造だなあ。


 さて、性自認についてもオッカムの剃刀風に考えてみる。  性自認という概念を持ち出すことなく、世間での扱われ方を変えてもらうことができるなら、そのほうがシンプルでいいよねって話。しかし、思うに、今の世間は性別によって人間の扱い方を変えることをやめようとはしない。少なくとも、すぐに世間が変わることはなさそう。そういうことを踏まえると、既存の「性別」という概念の力を借りることによって自らの扱われ方を変えることができる「性自認」概念は、かなり理にかなっていて有用なアイテムだなあと感心する。(何様?)


 ここで、「身体の性が本来の性別だ!」とか「性自認というのが真の性別なのだ!」などというのはどちらもナンセンスだ。なぜなら、ここで問題になっているのは「性という言葉をどのように用いることが良い社会に繋がるのか?」ということだからだ。


 新しい概念が生み出されようとしているとき、そこには必ずプラグマティックな問いが生じる。生じなくてはならない。

モンテカルロ法で円周率を求める

モンテカルロ法で円周率を求めるやつを実装した。 プロットする点の数を入力してボタンを押すと、点がランダムに生成される。どれくらいの割合で円の内部に含まれたかを計算することにより、円周率を求めることができる。プロット数が大きいほど当然精度は上がるが、処理はクライアントサイドなので好きに決めてほしい。

プロット数:

計算結果:

ChatGPTコーディングのTIPS

 ChatGPTはすこぶる優秀なプログラマーだ。私は、これまでに色々な開発を彼にお願いしてきた。今回は、彼に開発を依頼するときの作法をまとめようと思う。備忘録のようなものなので、体系的にはならなかった。

 

GPT-4に英語で命令せよ

 まずは基本的なところ。2023年5月現在のGPTの最新バージョンであるGPT-4を使用しておきたい。その上で、他の言語よりも英語で命令するのが望ましい。当然ながら、英語の文章はGPTの学習に際して最も多く投入されている。正確なレスポンスが欲しいのであれば英語で命令しない選択肢はない。

 英語が苦手な人は、それこそGPTに翻訳させるのがいいと思う。彼は言語処理のプロなので、文脈もある程度汲み取って柔軟に翻訳してくれる。

 

単体開発をさせるべし

 これはChatGPTだからというよりも、システム開発の基本である。

 例えば、「Webサイトから抽出してきた文字列をSNSに投稿する」というシステムを作成するとする。

 このとき、このシステム全体をGPTに作らせてはいけない。うまく動作しなかった際に、原因の切り分けがしにくくなるからだ。

 以下の1、2というユニットに分けて、それぞれをGPTに作成させるのがよい。

  1. Webサイトから文字列を抽出してコンソールに出力する機能
  2. 与えられた文字列をSNSに投稿する機能

 それぞれ上手く動作したことを確認したら、自分で結合して完成だ。

 

箇条書き形式で命令せよ

 相手は人工知能なのだから、人間に伝えるような自然な文章として体裁を整える必要はないのだ。そのため、箇条書き形式で命令をしたほうが、手間もかからないし、要件を伝達しやすいと思う。

 "Please generate a script. The requirements are below."などのように伝え、要件を羅列していくのが最も書きやすかった。

 

情報の不足を考慮せよ

 この命令ができるところがChatGPTの真価であると言ってよい(言い過ぎ)。命令文の最後に「情報に不足があれば質問してください」という旨を記載する。"If you need more information, please ask me."みたいな感じでいい。

 僕らは人間なので、文脈や前提条件などを要件に盛り込み忘れるときがある。そうした場合、普段ならGPTは勝手に文脈を想定してとりあえずの回答をくれるのだ。でも、この文言を追加すれば、回答に必要なピースを向こうから求めてきてくれるのだ。

 すべての命令文の末尾には、とりあえずこれをつけておくのが無難だ。

 

出力が途切れたときは

 GPTに文章を生成させていると、ときどき文章の途中で回答が途切れることがある。その場合は、"Go on""Continue" などと命令すれば、途切れたところから出力を続けてくれる。日本語で命令したときには「つづき」などと言えばよい。

 

まとめ

 AIにプログラミングを任せられるようになったのは非常に嬉しい。もっと性能が向上すれば、個人が気軽に大規模システムを生成できる時代が来るかもしれない。

Cesium JS をはてなブログに埋め込んでみる

↓下に地球儀を表示したい↓。いろいろ試しているが、上手くできない。

RSA暗号の原理(+証明)

概要

 RSA暗号は現在普及している公開鍵暗号の基礎となる暗号技術である。説明しているサイトは色々あるが、他人が書いたものなので読みにくかった。私にとって分かりやすいように書く。Wikipediaの同項目を参考にした。

 証明中で用いたオイラーのφ関数とフェルマーの小定理については後半で解説した。

 

暗号化と復号

 0以上n未満の整数の集合を\mathbb{Z}_nとおく。

 異なる2つの素数 p, q をとり、 n:=p,q を定義する。

  (p-1)(q-1)と互いに素であるような e(公開鍵)を任意に設定する。

 このとき、秘密鍵 d \in \mathbb{Z}_n

\begin{align} d \equiv e^{-1} \pmod n \end{align}

、すなわち eのモジュラ逆数となるように作成される。 eのみから導くのは困難だが、p, qが既知であれば、ユークリッドの互除法によって導出できる。

 平文 a \in \mathbb{Z}_n-\{0\}について、暗号文 bは、

\begin{align} b = \{ z \in \mathbb{Z}_n | z \equiv a^e \pmod n \} \end{align}

と算出できる。これを復号したものを a'とすると、

\begin{align} a' = \{ z \in \mathbb{Z}_n | z \equiv b^d \pmod n \} \end{align}

とかけ、 a' = aである。

 

原理の証明

  e \phi(n)=(p-1)(q-1)オイラーのφ関数)は互いに素だから、任意の正の整数 dについて、

\begin{align} de -x\phi(n)= 1\end{align}

となるような正の整数 xが存在する。

定義より

\begin{align} a' \equiv a^{de} \pmod n = a^{x\phi(n)+1} = (a^\phi(n))^x \cdot a \tag{1} \end{align}

である。したがって、

\begin{align} a' \equiv (a^\phi(n))^x \cdot a \pmod p \tag{2} \\\ a' \equiv (a^\phi(n))^x \cdot a \pmod q \tag{3} \end{align}

が成立する。

  a n未満であることから、以下の( i )( ii )( iii )によって、すべての場合を扱える。以下では式(1),(2),(3)を用いる。

( i )  a p,qのそれぞれと互いに素であるとき

 フェルマーの小定理より

\begin{align} a^{\phi(n)} \equiv 1 \pmod p \tag{3} \\\ a^\phi(n) \equiv 1 \pmod q \tag{4} \end{align}

が成立する。式(3),(4)より

\begin{align} a^{\phi(n)} \equiv 1 \pmod n \end{align}

であるから、

\begin{align} a' = (a^{\phi(n)})^x \cdot a \equiv a \pmod n \end{align}

が成立する。

( ii )  a pの倍数であるとき

\begin{align} a \equiv 0 \pmod p \end{align}

であるから、

\begin{align} a' = a^\phi(n) \cdot a \equiv a \pmod p \tag{5} \end{align}

である。

  a qと互いに素だから、フェルマーの小定理より、

\begin{align} a^{q-1} \equiv 1 \pmod q \end{align}
が成立する。よって、

\begin{align} a^\phi(n) = a^{(p-1)(q-1)} \equiv 1 \pmod q \end{align}

であることから、

\begin{align} a' = (a^\phi(n))^x \cdot a \equiv a \pmod q \tag{6} \end{align}

となる。式(5),(6)より、

\begin{align} a' \equiv a \pmod n \end{align}

が成立する。

( iii )  a qの倍数であるとき

 ( ii )と同様にして

\begin{align} (a^\phi(n))^x \cdot a \equiv a \pmod n \end{align}

が示される。

 ( i )( ii )( iii )より、すべての場合について

\begin{align} a' \equiv a \pmod n \end{align}

が成立する。

  a,a' \in \mathbb{Z}_n-\{0\}であるから、 a'=aである。

 

オイラーのφ関数

 正の整数 nに対して、 nと互いに素である 1以上 n以下の整数の個数 \phi(n)のことをこう呼ぶ。

 したがって、 n素数ならば \phi(n)=n-1である。

 異なる2つの素数 p, q について  n:=pq を定義したとき、

\begin{align} \phi(n) = (p-1)(q-1) \end{align}

が成り立つ。

 

フェルマーの小定理

 任意の素数  p と、 pの倍数でない任意の整数  a について、

\begin{align} a^p \equiv a \pmod p \end{align}

が成立する。

証明

 任意の素数  p と任意の正の整数  m をおく。二項定理より、

\begin{align} (m+1)^p=m^p+{}_p\mathrm{C}_1 m^{p-1} + {}_p\mathrm{C}_2 m^{p-2} + \cdots + {}_p\mathrm{C}_{p-1} m + 1 \tag{★} \end{align}

が成り立つ。

  p素数であるため、 p未満の正の整数 kについて {}_p\mathrm{C}_k pの倍数となることから、

\begin{align} (m+1)^p \equiv m^p+1 \pmod p \end{align}

が成立する。

( i ) 式(★)に  m=1 を代入すると、

\begin{align} 2^p \equiv 2 \pmod p \end{align}

となり、 a=2 において命題は成り立つ。

( ii ) 命題が  a=k (k = 2,3,\cdots) において成立すると仮定する。

 このとき、式(★)から、

\begin{align} (k+1)^p \equiv k^p+1 \pmod p \end{align}

であり、仮定より、

\begin{align} k^p \equiv k \pmod p \end{align}

であることを踏まえると、

\begin{align} (k+1)^p \equiv k+1 \pmod p \end{align}

となり、 a = (k+1) においても命題が成立する。

 ( i )と( ii )より、題意は示された。

 

まとめ

 楽しかった。せっかく原理を学んだので、RSAで平文を暗号化するツールを作りたい。