このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

イプシロン-デルタ論法はなぜ難しいのか? どうしたら分かるのか? 分かる必要があるのか?

先週末に、N君が「イプシロン-デルタ論法って、なんすかアレ? 全然分からないっす!」と言ってました。そのときはそれ以上話す時間もなかったし、次回会うときはこの話題を忘れてしまうかも知れないので、書き記しておきます。

僕は、伝統的なイプシロン-デルタ論法そのものには懐疑的です*1。ゴタゴタした不等式をいじり回すのは早々に切り上げて、開集合を導入したほうがいいと思います。そんな思いから、出来るだけ不等式を使わずに集合族に注目するスタイルイプシロン-デルタ論法を紹介します。

内容:

イプシロン-デルタ論法

イプシロン-デルタ論法(ε-δ論法)は、関数(写像)が連続であることを記述するときに使われる手法です。イプシロン-デルタ論法に出会う前に、関数の連続性については習っていることが多いと思います。おそらく、次のような連続性の“定義”だったでしょう。

  • fがaで連続であるとは、xがaにドンドン近付くとき、f(x)はf(a)にドンドン近付くこと。

「ドンドン」という擬態語を使いましたが、「限りなく」とか「いくらでも」とか表現することもあります。日本語の言い回しを多少変えたところで、本質において擬態語「ドンドン」と大差ありません。このテの表現・定義のスタイルをドンドン論法と呼びましょう。

ドンドン論法による“定義”は、直感に訴える比喩的表現なので、あまり正確とはいえません。ドンドン論法よりもっと正確で、その後の議論にも耐えられる定義をしましょう -- ということでイプシロン-デルタ論法の登場となります。イプシロン-デルタ論法が、ドンドン論法と同様な発想でより精密さを増す方向での進化ならば、「全然分からないっす!」という反応にはならないでしょう。ドンドン論法とイプシロン-デルタ論法のあいだには、何か大きなギャップがあるということです。

そのギャップは、発想の転換、あるいは知的イノベーションとでも呼ぶべきものです。ドンドン論法においては直感的・比喩的理解に重要な役割を果たしていたモノが、イプシロン-デルタ論法では捨て去られています。捨て去られたモノとは:

  1. 時間的な変化、運動の比喩、ダイナミックな感じ。
  2. 一点のまわりのごく小さな範囲で考えているという設定における「小ささ」。

それと、イプシロン-デルタ論法のために必要なスキルとして、次が要求されています。

  1. 点の集合だけでなく、集合の集合を扱うスキル(あるいは慣れ)。
  2. 「任意の」「存在する」という言葉を含む論理的な表現を扱うスキル(あるいは慣れ)。

時間や運動のイメージを捨て去る

ドンドン論法による連続性を、

  • x→a ならば、f(x)→f(a)

のようにも書きます。あるいは、次のようにも書きます。

  • limx→a f(x) = f(a)

記法を整えても、相変わらず定義そのものは「ドンドン」なので、動く点xが定点aに向かってドンドン近づいていくという運動のイメージです。運動のイメージをそのまま論理的な表現に翻訳するのは難しい(どうしていいか分からない)ので、いったん時間/運動のイメージは捨て去って、より静的/空間的な定義を探しましょう。

fが(直感的に)連続なら、aの回りの小さな領域をとると、その領域をfで移した(写した)先の領域も小さいでしょう。この“感じ”を連続性の定義の背景として使います。

  • fがaで連続であるとは、aの回りの小さな領域は、f(a)の回りの小さな領域に移ること。

ウーン、あまり正確さが向上した気はしませんね。でも、時間や運動の概念は剥ぎ取っていて、領域や範囲という空間的な概念による記述にはなっています。言い回しを少し変えると:

  • fがaで連続であるとは、“aの回りの十分に小さな領域”が移った先の領域は、“f(a)の回りのとある小さな領域”からはみ出ないこと。

これは、aの周辺でのfの挙動がおとなしいことです。はみ出し(逸脱し)たり暴れまくるような不良=ヤンチャな行動はしないのです。「挙動」、「行動」と言うとまた時間的な匂いがするので、いまの注釈は、あくまで気持ちの問題について語っただけ、と受け取ってください。

上記の空間的な定義でも、「小さな」とか「はみ出る」とか曖昧な表現が残っています。この曖昧性を何とかするために、距離概念を準備しましょう。

ユークリッド距離と開球体

1次元でもn次元でも労力は大差ないので、一般のユークリッド空間Rnで話をします。Rnに次の標準ユークリッド距離を入れます。

 d(x, \, y) \: := \sqrt{\sum_{i = 1}^{n} (y_i - x_i)^2 }

n = 1 の場合なら、x, y∈R で:

 d(x, \, y) \: := \sqrt{(y - x)^2 } = | y - x |

n = 2 の場合なら、x, y∈R2, x = (x1, x2), y = (y1, y2) で:

 d(x, \, y) \: := \sqrt{\sum_{i = 1}^{2} (y_i - x_i)^2 } = \sqrt{(y_1 - x_1)^2 + (y_2 - x_2)^2}

nが異なればdも異なる関数なので、dRnとか書くべきでしょう。dRnは面倒なのでdnで次元を明示することにします。混乱の心配がないなら、nが異なっても同じdで示します。

「領域」とか「範囲」という言葉に意味を与えるため、次の定義をします。

  • OBalln(a, r) := {x∈Rn | dn(a, x) < r}

OBalln(a, r)は、n次元空間における“中心がaで半径がr”な開球体(open ball)です。n = 1 なら長さ2rの区間です。n = 2 なら、半径rの開円板(open disk)です。

曖昧なまま「領域」とか「範囲」と言うより、開球体OBalln(a, r)を使うほうが話がハッキリします。

扱う関数達と実例

XはRnの部分集合、YをRmの部分集合(後述するが、実際はXもYも開集合)として、f:X→Y という形の関数(写像)を扱いましょう。n = m = 1 のときは、fは通常の1変数関数です。n = 2, m = 1 ならば、fは2変数関数ですね。

典型的な事例のグラフを描いてみます。(描画にはMaximaを使いました。)

  • X = {x∈R | -2 < x < 2}
  • Y = {y∈R | -10 < y < 15}
  • f(x) = x3 + x + 1


  • X = {(x, y)∈R2 | -2 < x, y < 2}
  • Y = {z∈R | 0 < z < 10}
  • f(x, y) = x2 + y2

よく見かける関数は連続関数ですが、0で不連続になるような関数の例を出します。

  • X = {x∈R | -3 < x < 3}
  • Y = {y∈R | -2 < y < 2}
  • f(x) = if (x ≧ 0) then 1 else 0

上の関数は、x = 0 のところで跳ねています。0の周辺にどんなに小さな領域を取っても、y側の範囲は小さくなりません。

  • X = {x∈R | -1 < x < 1}
  • Y = {y∈R | -2 < y < 2}
  • f(x) = if (x = 0) then 0 else sin(1/x)

上の関数は、x = 0 の周辺で激しく小刻みに振動します。これも、0の周辺に非常に小さな領域を取っても、y側の範囲は小さくなりません。

グラフとしては描けないのですが、次のような関数も0で(実際はいたる所で)不連続です。

  • X = R
  • Y = R
  • f(x) := if (xが有理数) then 1 else 0

平面から平面への写像

X⊆Rn, Y⊆Rm, f:X→Y において、n = 2, m = 2 ならば、fは平面の一部を平面の一部に移す(写す)ような写像です。このようなfを関数のグラフとして描こうと思うと、4次元の空間内の図形となり、うまく可視化できません。「R言語で複素関数の可視化」で使ったような図示(可視化)の方法を使うと、多少はfの感じをつかめます。

まず、平面内に方眼紙の網目(格子模様)を描きます。

この方眼網目が、写像で移された先でどのように変形するかを見ます。複素関数 w = z2 なら次のように変形します。なお、w = z2 を実2変数関数2つで表すなら、f(x, y) = x2 - y2, g(x, y) = 2xy です。

次は平方根関数 w = sqrt(z) の絵で、かなりたくさんの網目を描いています。

この後出てくる手描きの図は、平面の一部が変形されて別の平面に移る(写る、送られる、対応付けられる)という状況で図示したものです。

一点の周辺を記述する開球体の族

先ほど「時間的に変化するダイナミックなイメージは捨てるのだ」と言いました。これは、直感的イメージを持ってはいけない、ということではありません。直感的イメージは重要だし、必要です。「運動」や「小さい」というイメージを追求する方向性は、連続性の正確な定義にはあまり適切じゃない、ということです。それで、時間概念より空間概念を主体にした視覚化を前節で紹介したのです。

さて、「ある一点の周辺」という概念を定式化しましょう。一点の周辺とはその点を含む領域・範囲です。「領域・範囲」という言葉も曖昧です。ここでは、「その点を含む領域・範囲」として、その点を中心とする開球体(open ball)を考えましょう。もちろん、球体以外の形状を考えてもいいのですが、球体はとても扱いやすいので、とりあえずは球体に限定しましょう。

a∈Rn として、aを中心とした開球体はたくさんあります。たくさんありますが、半径を指定すれば開球体は1つに決まります。よって、次のように書けます。

  • (aを中心としたすべての開球体の集合) = {OBalln(a, r) | r∈R, r > 0}

aを中心とした開球体の全体は、正の数r(半径)でパラメトライズ、あるいはインデックスされます。n次元開球体の全体は“集合の集合”です。R>0 = {r∈R | r > 0} とすると、n次元開球体の全体は Rn×R>0 と1:1の対応があります。その対応は、a = (a1, ..., an) として、OBalln(a, r) ←→ ((a1, ..., an), r) ←→ (a1, ..., an, r) 。この事情から、開球体の全体はかなり把握しやすい“集合の集合”だと言えます。

“集合の集合”を(集合の)(family of sets)とも呼びます。n次元開球体の全体も、aを中心とする開球体の全体も族です。aを中心とする開球体の族(family of open balls)を、OBALLSRn(a)と書くことにします。集合族であることを強調する目的で、全部大文字の名前OBALLSとしました。

X⊆Rn, a∈X とするとき、“aの周辺”(の定式化)としてaを中心とする開球体族を考えます。Xにスッポリ入る開球体が常に取れるように、Xに次の条件を付けます。

  • [どこでも開球体が取れる] Xの任意の点aにおいて、aを中心とするする開球体Aで、A⊆X となるものが(少なくとも1つは)存在する。

これは、あるr(r > 0, rは半径)に対して、A = OBalln(a, r) と書けて、A⊆X となることです。条件を満たす半径rの開球体OBalln(a, r)が1つみつかれば、0 < r' ≦ r である開球体OBalln(a, r')はすべて条件を満たすので、条件を満たす開球体はイッパイあります。

上記の条件[どこでも開球体が取れる]を満たすX(X⊆Rn)を、Rn開集合(open set)といいます。ここでは、Rnの開集合XからRmの開集合Yへの写像(関数)を考えることになります。

写像による開球体の像

XはRnの開集合、YはRmの開集合、f:X→Y として、a∈X とします。aを中心とする開球体OBalln(a, r)のなかで、Xにスッポリ入るものだけ考えます。そういう開球体の全体をOBALLSX(a)とします。

  • OBALLSX(a) = {A∈OBALLSRn(a) | A ⊆ X}

あるいは、

  • OBALLSX(a) = {OBalln(a, r) | OBalln(a, r) ⊆ X}

Xは開集合だったので、Xのどの点aを取っても、OBALLSX(a)は空ではありません -- aを中心とする開球体があるってことです。

さて、X内の開球体 A∈OBALLSX(a) を取れば、fによるAの像f(A)(f(A)⊆Y)を考えることができます(下の図)。fの連続性は、f(A)が拡がり過ぎない、節度ある範囲に収まることでした。この「拡がり過ぎない」とか「節度ある範囲に収まる」をうまく定式化したいのです。

ここでまた、少し発想を変える必要があります。「開球体Aが小さないなら、f(A)も小さい」といった“大小に関わる概念”を捨てて、Y側に特定の範囲(これも開球体)Bを指定したとき、f(A)がB内にスッポリ収まる、という言い回しにします。

  • B∈BALLSY(f(a)) を指定したとき、うまいこと A∈BALLSY(a) を選ぶと、f(A)⊆B と出来る。

f(A)が「拡がり過ぎない/節度ある範囲に収まる」とは、指定したBからf(A)がはみ出さないことだと解釈します。

デュエルゲームとしての連続性

プログラミングに関する随分昔の記事で、仕様を提示する側と実装を行う側をゲームの対戦相手に喩えたことがあります。

このゲームとは、要求を出す側と要求に応える側が交互にコード(仕様記述コードと実装コード)を出し合うことです。「俺のターン/おまえのターン」となるので、デュアル(ペアの類語)からデュエル(カードゲームの名前)に後で名称変更しています。

写像(関数)の連続性の定義のなかには、要求を出す側と要求に応える側によるゲームとしての側面があります写像 f:X→Y に関するゲームは、X側とY側でプレイします。Y側が要求を出す側で、X側が要求に応える側です。

Y側の手札セットは、点f(a)を中心とする開球体族OBALLSY(f(a))です。族のなかから開球体Bを選んで提示します。

  • Y側:俺のターン。俺が選んだf(a)を中心とする開球体はこのBだ。おまえのターン。

次にX側は、自分の手札セットである開球体族OBALLSX(a)から開球体Aを選んで対戦します。

  • X側:俺は、aを中心とするこの開球体Aをセット。さー勝負だ。

勝敗を決めるルールは次のとおり。

  • f(A)⊆B となったときはX側の勝ち。
  • そうでないなら、Y側の勝ち。

fがaで連続であるとは、X側が常に勝てることです。どんなBを指定されても、適切なAを選べば f(A)⊆B と出来ることです。指定されたBからf(A)がはみ出さない、f(A)が「拡がり過ぎない/節度ある範囲に収まる」状況です。次の絵は、X側が負ける状況です。開球体Aをどう選んでも、開球体B内にf(A)を収めることができないときです。


  • X側:ダメだ。俺の手札には、お前の開球体Bに入り込める開球体がない。俺の負けだ。

論理式で書き下そう

前節のゲームの比喩において、Y側がどんな開球体Bを選ぶかは事前に予測できません。別な言い方をすると、Bは任意の開球体と考える必要があります。それに対してX側は、出されたBに応じて適切な開球体Aを選ぶことになります。適切なAが存在することがX側が勝てる条件です。そして、適切なAとは、f(A)⊆B となるようなAです。

以上のことから、X側が常に勝てる条件は次のように書けます。

  • B∈OBALLSY(f(a)) である任意のBに対して、A∈OBALLSX(a) であるAが存在して、f(A)⊆B となる。

「任意の」を表す∀と、「存在する」を表す∃を使うならば:

  • ∀B∈OBALLSY(f(a)). ∃A∈OBALLSX(a). f(A)⊆B

記号に不慣れだと違和感があるかもしれませんが、おおよその意味は:

  • 任意の“Y側の開球体B”に対して、“X側の開球体A”が存在して、f(A)⊆B だ。

日本語にニュアンスを込めれば:

  • 勝手に指定された“Y側の開球体B”に対して、“X側の開球体A”を頑張って選べば、f(A)⊆B だ。

この時点で、開球体の大小に関する言及は全くなくなっています。しかし、ゲームとしてのせめぎあいを考えれば、Y側は小さな開球体を選ぶだろうし、X側も小さな開球体を探して応戦せざるを得ないでしょう。この事情を反映させるなら:

  • どんなに小さな“Y側の開球体B”に対しても、十分に小さな“X側の開球体A”を選べて、f(A)⊆B と出来る。

なんて表現になります。

とはいえ、論理式それ自体はドライなもので、開球体の大小もゲームのせめぎあいも一切含まれないのです。この余分なエモーション/イマジネーションを削り落としたドライさが、推論のパワーにつながるのです。しかしだからといって、我々の心のなかのエモーション/イマジネーションまでも禁じるわけではありません。

再びイプシロン-デルタ論法

前節までの話で、イプシロン-デルタ論法の説明はオシマイです。

エーーッ、イプシロンもデルタも出てきてないじゃん!
俺が知っているイプシロン-デルタ論法とちゃう

そうですね。明示的にはεもδも使ってませんが、内容的にはイプシロン-デルタ論法(の精神)による連続性の定義は語り終わっています。

ほんとにこれで終わりにすると後味が悪いでしょうから、補足しましょう。話を簡単にするために、X = Rn, Y = Rm とします。前節の話で出てきた開球体Bの半径をε、開球体Aの半径をδという文字で表すことにします。もちろん、ε, δ∈R>0 です。

ε, δを使って、B = OBallm(f(a), ε)、A = OBalln(a, ε) と書けます。前節の、fがaで連続である条件をε, δを含む形に書き換えると:

  • 任意のOBallm(f(a), ε)に対して、OBalln(a, δ)が存在して、f(OBalln(a, δ))⊆OBallm(f(a), ε) となる。

開球体の記号を使わずに、正の数ε, δを主役にして書き換えます。まず最初に、f(OBalln(a, δ))⊆OBallm(f(a), ε) の部分だけを書き換えてみます。この部分は、

  • x∈OBalln(a, δ) ならば、f(x)∈OBallm(f(a), ε)

と言えるので、

  • dn(a, x) < δ ならば、dm(f(a), f(x)) < ε

全体を書き換えると:

  • 任意のεに対して、δが存在して、dn(a, x) < δ ならば、dm(f(a), f(x)) < ε が成立する。

これが、伝統的イプシロン・デルタ論法による連続性の記述です。ここに出てくる変数x(x∈Rn)も任意ですから、それも明示して論理記号を使って書くなら:

  • ∀ε∈R>0. ∃δ∈R>0. ∀x∈Rn. (dn(a, x) < δ ⇒ dm(f(a), f(x)) < ε)

この論理式をイキナリ出されたら、ビックリするかウンザリするでしょうが、今までの流れを思い起こしてみれば、写像fが点aの所で跳ねたり暴れたりしないことを表現していると分かるでしょう。

開集合XとYを考慮して、伝統的イプシロン-デルタのスタイルで書くと、論理式はずっと複雑化して、本気でウンザリします。入れ子の∀, ∃、たくさんの不等式を相手に頑張るよりは、集合族による定義のほうが楽だと思います。

今回使った集合族は、一点の回りの開球体族ですが、一点の回りの近傍族、空間全体の開集合族と発展させることが出来ます。


イプシロン-デルタ論法それ自体をゴールに設定して勉強するのは何か虚しいし、やる必要性があるか疑問です。集合や論理に慣れる目的でも、ふさわしいとは思えません。その後に距離空間位相空間連続写像へと進む通過点と捉えるならやる意味はあるでしょう。

いずれにしても、ドンドン論法とイプシロン-デルタ論法のあいだには色々とギャップがあるし、新しいスキルも要求されます。いきなり、ε, δ, ∀, ∃とか出されたら面食らうのは当たり前です。ギャップを意識して、新しいスキルを獲得しながら順番に進めば、「全然分からないっす!」から抜け出せると思いますよ。


*1:[追記]「懐疑的」とは、イプシロン-デルタ論法を学ぶことは「それほど重要じゃない」と思ってる、ってことです。正の数ε, δに関する命題が重要なのではなくて、距離空間において、一点の近傍での関数の挙動を云々してるという意識を持てればいいだろう、と。[/追記]