Гэдрэг тархалт

Нейроны сүлжээг градиентийн аргаар сургах үед холбоосуудын жин болон нейронуудын хазайлтыг бага зэрэг өөрчлөхөд алдааны функц яаж өөрчлөгдөх вэ гэдгийг илтгэх уламжлалуудыг тооцох хэрэгтэй болно. Энэ үүргийг практикт алдааг гэдрэг тархаах алгоритм гүйцэтгэдэг.

Нейроны сүлжээ гэдэг маань шугаман эвлүүлэг, өдөөгч функцийн үйлчлэл хоёрыг л олон дахин давтчихсан зүйл байгаа шүү дээ. Тэгэхээр эхлээд гол санааг нь ойлгох үүднээс нэг хялбар жишээ авч үзье.

z=f_2(w_2f_1(w_1f_0(w_0x))).

Үүнийг рекурсив байдлаар

\begin{aligned}&y_0=w_0x,\qquad &z_1=f_0(y_0),\\ &y_1=w_1z_1,\qquad &z_2=f_1(y_1),\\ &y_2=w_2z_2,\qquad &z=f_2(y_2),\end{aligned}

гэж бичээд, дараах маягаар дүрсэлбэл зохимжтой.

Оролт x болон w_0,w_1,w_2 параметрүүдийн утга өгөгдсөн байгаа гэж үзэх ба эдгээр параметрүүдийн утгыг нэг нэгээр нь бага зэрэг өөрчлөхөд гаралт z хэр ихээр өөрчлөгдөх вэ гэдгийг илэрхийлэх уламжлалуудыг тооцох нь бидний зорилго. Завсрын y_0,z_1,y_1,z_2,y_2 хувьсагчдын утгыг тооцчихож болох учраас тэдгээрийг бас өгөгдсөн гэж үзэж болно. Энэ процессыг шууд процесс гэж ярьдаг. Ингээд давхар функцийн уламжлал боддог томъёоноос шууд

\displaystyle\frac{\partial z}{\partial w_2}=f_2'(y_2)z_2,\qquad\frac{\partial z}{\partial w_1}=f_2'(y_2)w_2f_1'(y_1)z_1,\qquad\frac{\partial z}{\partial w_0}=f_2'(y_2)w_2f_1'(y_1)w_1f_0'(y_0)x

гэж гарна. Эдгээр томъёог арай цэгцтэй болгохын тулд z_0=x ба \displaystyle\delta_k=\frac{\partial z}{\partial y_k} гэсэн тэмдэглэгээнүүдийг оруулаад

\displaystyle\frac{\partial z}{\partial w_k}=\frac{\partial z}{\partial y_k}\frac{\partial y_k}{\partial w_k}=\delta_kz_k

гэж бичье. Тэгвэл \delta_k хэмжигдэхүүнийг

\displaystyle\delta_k=\frac{\partial z}{\partial y_k}=\frac{\partial z}{\partial y_{k+1}}\frac{\partial y_{k+1}}{\partial y_{k}}=\delta_{k+1}w_{k+1}f_k'(y_k)

гэсэн рекуррент томъёогоор тооцож болно. Энэ томъёонд мэдээлэл арагшаа (буюу гэдрэг) тархаж байгаа нь илэрхий:

Үүнийг бид гэдрэг процесс гэж ярих ба дээр хэлэлцсэнийг нэгтгэн дүгнэж бичвэл дараах алгоритм гарч ирнэ.

  • Оролт z_0=x болон w_k параметрүүдийн утга өгөгдсөн байгаа.
  • Эхлээд y_k=w_kz_k,\,z_{k+1}=f_k(y_k) томъёонуудаар y_k ба z_k-г тооцно (шууд процесс).
  • Хамгийн арын \delta хувьсагчийн утгыг онооно: \delta_2=f_2'(y_2).
  • Ингээд \delta_k=\delta_{k+1}w_{k+1}f_k'(y_k) томъёогоор \delta_k-г тооцно (гэдрэг процесс).
  • Эцэст нь \frac{\partial z}{\partial w_k}=\delta_kz_k томъёогоор уламжлалуудаа бодчихно.

Алдарт гэдрэг тархалтын алгоритмын гол цөм нь ердөө л энэ юм.

Одоо жинхэнэ нейроны сүлжээн дээр гэдрэг тархалт яаж ажиллахыг харъя. Үүний тулд сүлжээнийхээ оролтуудыг 1,\ldots,n гэж дугаарлаад, мөн нейронуудад нь n+1,\ldots,N гэсэн дугаар олгоод, эдгээрийгээ графын оройнууд гэж үзээд, дараах маягаар граф болгоё.

Тэгвэл ямар ч нейроны сүлжээнд чиглэлтэй, гогцоогүй граф харгалзана. Энд стандарт нейроны сүлжээний онцлог нь нэг давхарга доторх оройнууд хоорондоо холбогдоогүй, мөн давхарга алгассан холболт байхгүй байгаа. Харин гэдрэг тархалтын алгоритмыг тодорхойлохын тулд чиглэлтэй, гогцоогүй граф байхад л хангалттай (жишээ нь 1 ба 9-ийг шууд холбосон холболт байхад асуудалгүй).

Ингээд j дэх орой руу орсон ирмэг бүхий оройнуудын (j оройн «эх эцэг») олонлогийг P_j гэж, харин j дэх оройн гаралттай холбогдсон оройнуудын (j оройн «хүүхдүүд») олонлогийг C_j гэж тэмдэглэе. Жишээлбэл, дээрх зургийн хувьд

P_4=\{1,2,3\},\qquad P_9=\{4,5,6,7\},\qquad C_3=\{4,5,6,7\},\qquad C_9=\{11,12,13\}

байна. Цаашилбал, оролтын хувьсагчдыг z_1,\ldots,z_n гэвэл нейроны сүлжээний бусад оройнууд дээрх завсрын болон гаралтын хувьсагчдыг дараах томъёогоор бодно (шууд процесс):

\displaystyle y_j=b_j+\sum_{i\in P_j}w_{ij}z_i,\qquad z_{j}=f_j(y_j).\qquad(*)

Үүнд w_{ij} нь i ба j дугаартай нейронуудыг холбосон холбоосын жин, b_j нь j дэх нейроны хазайлт, y_j ба z_j нь харгалзан j дэх нейрон дээрх завсрын болон гаралтын хувьсагч, f_j нь уг нейроны өдөөгч функц. Өөрөөр хэлбэл, өмнөх нейронуудын гаралтыг жинлээд нэмснийг нь y_j, энэ тоо өдөөгч функцээр ороод гарсныг нь z_j гэж тэмдэглэсэн. Томъёонуудын гаргалгааг хялбарчлах үүднээс хазайлтыг жингийн нэг тухайн тохиолдол гэж үзэж болно: Нейрон болгон дээр үргэлж z_0=1 байдаг нэг оролт нэмлээ гэж төсөөлбөл энэ оролттой харгалзах жин нь уг нейроны хазайлт болох юм.

Дээр авч үзсэн жишээний 9-р нейроны оролт болон гаралттай холбогдсон нейронууд дээр шууд процессын үед юу болж байгааг нарийвчлан зурвал иймэрхүү харагдана.

Сүлжээний гаралтын нейронуудыг N-m+1,\ldots,N дугаартай гэж үзвэл, эдгээрийн гаралтнаас хамаарсан

E=E(z_{N-m+1},\ldots,z_N)

гэсэн функцээс сүлжээний жингүүдээр тухайн уламжлал авах нь бидний гол зорилго. Ингэхдээ сүлжээний жингүүд w_{ij}, хазайлтууд b_{j} болон y_k,z_k хувьсагчдын утга бүгд өгөгдсөн байгаа гэж үзнэ. Тухайн нэг w_{ij} гэсэн жингээс E функц зөвхөн y_j хувьсагчаар дамжин хамаарах тул юуны түрүүнд

\displaystyle\frac{\partial E}{\partial w_{ij}}=\frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial w_{ij}}=\delta_jz_i\qquad(\dagger)

гэж гарна. Түүнчлэн, хазайлтуудын хувьд

\displaystyle\frac{\partial E}{\partial b_{j}}=\frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial b_{j}}=\delta_j\qquad(\dagger\dagger)

болно. Энд

\displaystyle\delta_j=\frac{\partial E}{\partial y_j}

гэсэн тэмдэглэгээ оруулсан ба

\displaystyle\frac{\partial y_j}{\partial w_{ij}}=z_i

гэдгийг ашигласан. Одоо (\dagger),(\dagger\dagger) томъёонуудын амин сүнс болсон \delta_j хэмжигдэхүүнүүдийг тооцох л үлдлээ. Эхлээд j нь гаралтын орой биш үед, E функцийн y_j хувьсагчаас хамаарах хамаарал зөвхөн түүний хүүхдүүдээр дамжин явагдах тул

\displaystyle\delta_j=\frac{\partial E}{\partial y_j}=\sum_{k\in C_j}\frac{\partial E}{\partial y_k}\frac{\partial y_k}{\partial y_j}=\sum_{k\in C_j}\delta_kw_{jk}f_j'(y_j).

Үүнд

\displaystyle\frac{\partial y_k}{\partial y_j}=\frac{\partial y_k}{\partial z_j}\frac{\partial z_j}{\partial y_j}=w_{jk}f_j'(y_j)

гэсэн тооцоог ашигласан. Харин j нь гаралтын орой бол, E функцийн y_j хувьсагчаас хамаарах хамаарал зөвхөн z_j хувьсагчаар дамжин явагдана:

\displaystyle\delta_j=\frac{\partial E}{\partial y_j}=\frac{\partial E}{\partial z_j}\frac{\partial z_j}{\partial y_j}=\frac{\partial E}{\partial z_j}f_j'(y_j).

Ерөнхий тохиолдолд, E функцийг аль ч оройн гаралтаас хамаарч болдгоор

E=E(z_1,\ldots,z_N)

гэж авах ч боломжтой бөгөөд, энэ үед өмнөх 2 томъёог хоёуланг нь агуулсан дараах томъёо гарна.

\displaystyle\delta_j=\frac{\partial E}{\partial y_j}=\frac{\partial E}{\partial z_j}\frac{\partial z_j}{\partial y_j}+\sum_{k\in C_j}\frac{\partial E}{\partial y_k}\frac{\partial y_k}{\partial y_j}=f_j'(y_j)\Big(\frac{\partial E}{\partial z_j}+\sum_{k\in C_j}\delta_kw_{jk}\Big)\qquad(\ddagger)

Энд хүүхэдгүй оройнуудын хувьд C_j=\varnothing, гаралтаас нь E хамаардаггүй оройнуудын хувьд \frac{\partial E}{\partial z_j}=0 гэдгийг санаарай. Дээрх томъёог шууд процессын (*) томъёотой харьцуулбал, хоорондоо маш төстэй нь харагдана:

\displaystyle\eta_j=\beta_j+\sum_{k\in C_j}w_{jk}\delta_k,\qquad \delta_j=f_j'(y_j)\eta_j\qquad(\ddagger\ddagger).

Үүнд \beta_j=\frac{\partial E}{\partial z_j}. Энэ томъёо нь гэдрэг процесс гэгдэх тооцооны аргачлалыг, цаашилбал гэдрэг сүлжээ гэж нэрлэгдэх нэгэн шинэ сүлжээг тодорхойлно. Гэдрэг сүлжээний хувьд \delta_j нь z_j-ийн, \eta_j нь y_j-ийн, \beta_j нь b_j-ийн  үүргийг гүйцэтгэж байгаа. Мөн гэдрэг сүлжээний граф нь холбоосуудынх нь чиглэл эсрэгээрээ солигдчихсон болохоос анхныхаа (шууд) сүлжээний графтай яг адилхан:

Түүнчлэн, гэдрэг сүлжээний j дэх нейрон дээрх өдөөгч функц нь f_j'(y_j) гэсэн тоогоор үржүүлэх үйлдэл байгаа. Өмнөх жишээний хувьд гэдрэг процессыг 9-р орой дээр төвлөрч ажиглавал дараах дүр зураг харагдана.

Ингээд гэдрэг тархалтын алгоритм маань иж бүрэн боллоо.

  • Сүлжээний w_{ij}, b_{j} болон оролтын z_1,\ldots,z_n хувьсагчдын утга бүгд өгөгдсөн байгаа.
  • Эхлээд (*) томъёогоор y_k,z_k хувьсагчдыг тооцно (шууд процесс).
  • Дараа нь (\ddagger\ddagger) томъёогоор \delta_k хувьсагчдыг тооцно (гэдрэг процесс).
  • Эцэст нь (\dagger),(\dagger\dagger) томъёонуудаар уламжлалуудаа бодчихно.

Практикт бид гэдрэг тархалтын алгоритмыг алдааны функцийн уламжлалуудыг бодоход ихэвчлэн хэрэглэнэ. Скаляр оролттой (n=1), скаляр гаралттай (m=1) нейроны сүлжээ аваад, оролтыг нь x=z_0, гаралтыг нь z(x)=z_N(z_0) гэж тэмдэглэвэл, алдааны функцийн нэг жишээ нь квадратлаг алдааны функц гэгддэг

E=\displaystyle\frac12\sum_{\ell=1}^L|z(x_\ell^*)-z_\ell^*|^2

функц болно. Үүнд (x_\ell^*,z_\ell^*) гэсэн L ширхэг сургалтын өгөгдөл байгаа гэж үзсэн. Энэ алдааны функц нь

E=\displaystyle\sum_{\ell=1}^LE_\ell

хэлбэртэй тул, уламжлалыг бодоход сургалтын өгөгдлүүдтэй нэг нэгээр нь ажиллаж болно гэсэн үг.

Жишээ 1 (Квадратлаг функц). Скаляр гаралттай (m=1), гаралтын нейрон нь шугаман өдөөгч функцтэй

f_N(y)=y

нейроны сүлжээг квадратлаг алдааны функцтэйгээр

E=\frac12(z-z^*)^2

авч үзье. Үүнд z=z_N нь гаралт, z^* нь сургалтын өгөгдөл. Эндээс гаралтын нейрон дээрх \delta хувьсагчийг бодвол

\displaystyle\delta_N=\frac{\partial E}{\partial y_N}=z-z^*

гарна.

Жишээ 2 (Солбисон энтропи). Өмнөхтэй адилаар скаляр гаралттай (m=1) боловч гаралтын нейрон нь логистик өдөөгч функцтэй

f_N(y)=\sigma(y)=\displaystyle\frac1{1+e^{-y}}

нейроны сүлжээг авч үзье. Квадратлаг алдааны функцийн хувьд

\displaystyle\delta_N=\frac{\partial E}{\partial y_N}=(z-z^*)\sigma'(y_N)

бөгөөд, y_N их үед \sigma'(y_N)\approx0 тул градиентийн арга ихэд удаашрах аюултай. Үүнээс зайлсхийхийн тулд

\displaystyle\delta_N=\frac{\partial E}{\partial y_N}=z-z^*

байлгадаг тийм E=E(z) функцийг яаж сонгох вэ гэсэн асуултыг сонирхоё. Энд орсон уламжлалыг бодвол

\displaystyle\frac{\partial E}{\partial y_N}=E'(z)\frac{\partial z}{\partial y_N}=E'(z)\sigma'(y_N)=E'(z)\sigma'(\sigma^{-1}(z))

болох ба, \sigma'(y)=\sigma(y)(1-\sigma(y)) гэдгийг санавал

\displaystyle\frac{\partial E}{\partial y_N}=E'(z)z(1-z)

гарна. Тэгэхээр E(z) нь

E'(z)z(1-z)=z-z^*

буюу

E'(z)=\displaystyle\frac{z-z^*}{z(1-z)}=\frac{1-z^*}{1-z}-\frac{z^*}{z}

тэнцэтгэлийг хангана гэсэн үг. Одоо үүнийгээ шууд интегралчилбал солбисон энтропи гэгддэг, логистик гаралттай сүлжээний сургалтанд өргөн ашиглагддаг дараах алдааны функцэд хүрнэ.

E(z)=-(1-z^*)\ln(1-z)-z^*\ln z.

Олон өгөгдлийн хувьд солбисон энтропи маань мэдээж

E=-\displaystyle\sum_{\ell=1}^L\Big((1-z^*)\ln\big(1-z(x^*_\ell)\big)+z^*\ln z(x^*_\ell)\Big)

хэлбэртэй болно.

Эцэст нь, хоршсон жинтэй сүлжээний хувьд гэдрэг тархалтын алгоритмыг яаж зохицуулахыг сонирхоё. Хоршсон жинтэй гэдэг нь сүлжээний зарим холбоосын жин бие биенийгээ дагаж хувьсдаг гэсэн үг. Ийм сүлжээний нэг жишээг дор дүрслэв.

Энд жишээлбэл 1-3 ба 2-3 гэсэн холбооснуудын жин адилхан байх ёстой гээд анхнаас нь шаардчихсан байгаа. Холбоосууд дотор хоорондоо ялгаатай хэдэн жин байж болохыг w_1,w_2,\ldots гэх мэтчилэн дугаарлаад, w_\alpha гэсэн жинтэй холбоосуудад харгалзах бүх хос оройнуудын олонлогийг W_\alpha гэж тэмдэглэе. Тухайлбал дээрх жишээний хувьд

W_1=\{(1,3),(2,3),(6,8),(6,9)\},\qquad W_4=\{(3,6),(4,6),(5,6),(7,9)\}

байна. Тэгвэл жишээ нь E функцийн w_1 жингээс хамаарах хамаарал y_3,y_8,y_9 хувьсагчдаар дамжин явагдах бөгөөд

\displaystyle\frac{\partial E}{\partial w_{1}}=\frac{\partial E}{\partial y_3}\frac{\partial y_3}{\partial w_{1}}+\frac{\partial E}{\partial y_8}\frac{\partial y_8}{\partial w_{1}}+\frac{\partial E}{\partial y_9}\frac{\partial y_9}{\partial w_{1}}=\delta_3z_1+\delta_3z_2+\delta_8z_6+\delta_9z_6

болно. Энэ томъёог ерөнхий тохиолдолд бичвэл

\displaystyle\frac{\partial E}{\partial w_{\alpha}}=\sum_{j:(i,j)\in W_\alpha}\frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial w_{\alpha}}=\sum_{(i,j)\in W_\alpha}\delta_jz_i.\qquad(\S)

Гэдрэг тархалтын алгоритмын сүүлийн алхамд уламжлалуудыг тооцохдоо (\dagger) томъёоны оронд дээрх томъёог хэрэглэх ба бусад алхмууд нь өөрчлөгдөхгүй хэвээр үлдэнэ.

Сүлжээний жинг зөв хоршуулбал шаардагдах санах ойг багасгах, сургалтыг хурдасгах сайн талтай. Энэ механизмыг ашигладаг хоёр гол архитектур нь конволюцийн болон рекуррент сүлжээнүүд юм. Конволюцийн сүлжээний хувьд давхарга дахь нейронууд хоорондоо жингээрээ ялгагдахгүй. Дорх зурагт ижил жинтэй холбоосуудыг ижил өнгөөр зурсан. Хоорондоо холбогдоогүй хоёр оройн хоорондох холбоосыг 0 жинтэй гээд бэхэлчихсэн гэж үзэж болно.

Конволюцийн сүлжээ нь оролтуудынхаа хувьд зөөлтийн тэгшхэмтэй тул зураг боловсруулалтын эхний давхаргуудад их хэрэглэгддэг.

Рекуррент сүлжээ нь нэг сүлжээний гаралтыг яг адилхан сүлжээний оролтонд өгөх замаар сүлжээг «уртасгасныг» хэлнэ. Тодруулбал, F:\mathbb{R}^n\to\mathbb{R}^n гэсэн нэг сүлжээ байлаа гэвэл,

F\circ F:x\mapsto F(F(x)),\qquad F\circ F\circ F:x\mapsto F(F(F(x))),\qquad\ldots

маягийн сүлжээнүүдийг рекуррент сүлжээ гэдэг. Жишээ болгоод 2 давхаргатай сүлжээг 3 дахин давтсан рекуррент сүлжээг дор дүрслэв. Мөн ижил жинтэй холбоосуудыг ижил өнгөөр зурсан.

Цаашилбал, рекуррент сүлжээний давталт бүр нь шинэ оролттой, шинэ гаралттай байж болно. Дорх зурагт ийм оролт гаралтуудыг хар сумаар дүрсэлсэн.

Ингэснээр дурын урттай өгөгдлийг рекуррент сүлжээнд оруулах боломж нээгдэх бөгөөд сүлжээ өөрийгөө хэд дахин давтах нь сүлжээний оролтоос хамаардаг байхаар зохион байгуулж болно. Өөрөөр хэлбэл рекуррент сүлжээ нь хязгааргүй урттай

(\zeta_k,z_k)=F(\xi_k,z_{k-1}),\qquad k=1,2,\ldots

гэсэн рекуррент харьцааг төлөөлөх ба, \xi_k хувьсагчийн нэг утгыг «оролтын дараалал төгссөн» гэдгийг илтгэхэд, \zeta_k хувьсагчийн нэг утгыг «гаралтын дараалал төгссөн» гэдгийг илтгэхэд хэрэглээд, төгсгөлөг дараалал оруулахад төгсгөлөг дараалал гаргадаг байхаар сүлжээгээ сургахыг зорино гэсэн үг.

Сурталчилгаа
This entry was posted in Анализ, алгоритм and tagged , , , , , . Bookmark the permalink.

Хариу Үлдээх

Fill in your details below or click an icon to log in:

WordPress.com Logo

Та WordPress.com гэсэн бүртгэлээрээ сэтгэгдэл бичиж байна. Гарах /  Өөрчлөх )

Google+ photo

Та Google+ гэсэн бүртгэлээрээ сэтгэгдэл бичиж байна. Гарах /  Өөрчлөх )

Twitter picture

Та Twitter гэсэн бүртгэлээрээ сэтгэгдэл бичиж байна. Гарах /  Өөрчлөх )

Facebook photo

Та Facebook гэсэн бүртгэлээрээ сэтгэгдэл бичиж байна. Гарах /  Өөрчлөх )

Connecting to %s