기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

신경망의 개요

생물학적 뉴런(biological neuron)은 아래의 그림과 같이 구성되어 있다.
수상돌기: 인접한 뉴런의 정보를 수집
세포핵: 수집된 정보를 바탕으로 해당 세포의 고유값을 생성
축색돌기: 생성된 고유값을 다른 세포들에게 제공
시냅스: 축색돌기 말단과 이웃한 뉴런의 수상돌기가 연결된 지점. 인간의 두뇌에서의 대부분의 지적 기능은 이들 시냅스에 저장된 정보가 지배

일정한 값이 시냅스를 통해 조절되고 수상돌기에 의해 입력된다. 이 입력된 신호는 어느 정도(임계치)이하 이면 단순히 저장된다. 그러나 임계치 이상이 되면 세포의 활성화를 일으켜 축색을 통해 이동한다. 즉, 출력된다.이러한 과정을 신경망 이론에 사용하기 위한 알고리즘으로 만들어 내기 위해서는 입력으로 부터 입력강도의 조절, 계산, 출력의 단계를 각각 고려하여 모델을 설정할 필요가 있다.
위의 그림은 하나의 신경세포이고 이 들의 연결고리에 해당하는 것을 시냅스(synapse)라고 한다.


고리즘  
위 그림은 단순하게 다음과 같은 수학적 모형으로 표현이 가능하다.

$$
u=\sum^n_{i=1} w_ix_i
\begin{cases}
\phi(u)=1, & \text{if} \, u \geq \theta\\
0,   &\text{otherwise}
\end{cases}
$$

n개의 입력치들의 각각에 가중치를 고려하여 받아들이도록 정의함으로서 각 입력의 강도를 조정한다. 이것은 신경포의 관계에서 시냅스에 의한 입력의 강도와 같은 기능을 모형화한 것이다. 이렇게 가중치가 고려된 모든 입력값들의 합이 연산이 실행되는데 활성화함수(activation function)라고 하는 $\phi(u)$  에 의해 실행된다. 그 결과는 다음 신경세포로 전달된다.
인공뉴런에서 주로 사용되는 활성화 함수는 다음과 같다.
sign: $f_g(z)=\begin{cases}+1, & z \ge 0 \\ -1, & z>0 \end{cases}$
sigmoid: $f_s(z)= \frac{1}{1+e^{-z}}, \; 0 \le f\le 1$
tanh: $f_t(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}, \; -1 \le f \le 1$
ReLU: $f_r(z)=\text{max (0, z)},\; 0 \le f \le \infty$

이 활성화함수를 선택하는 것이 중요합니다. 다음은 주요하게 사용되는 활성화 함수들의 정의와 그래프입니다.
>>> x=np.arange(-10, 11)
>>> y=[]
>>> y1=[]
>>> for i in x:
           if i >= 0:
                y.append(1)
                y1.append(1)
        else:
                y.append(0)
                y1.append(-1)
>>> plt.plot(x, y) # 계단함수
>>> plt.plot(x, y1) #부호함수
>>> plt.show()
다음 그림의 파란색이 계단함수, 주황색이 부호함수

#선형함수
>>> plt.plot(x, x)
>>> plt.show()


#시그모이드 함수
 >>> y2=1/(1+np.exp(-x))
>>> plt.plot(x, y2)
>>> plt.show()


#하이퍼 탄젠트 함수
 >>> y3=(np.exp(x)+1)/(np.exp(x)-1)
>>> plt.plot(x, y3)
>>> plt.show()


#ReLU 함수
>>>  y4=[]
>>> for i in x:
            y4.append(max(0, i))
>>> plt.plot(x, y4)
>>> plt.show()

신경망 이론에서 주요한 3가지 요소들이 위의 그림들과 같은 활성화함수, 신경망 구조, 학습알고리즘이다.

위에서 언급한 것과 같이 신경망 구조의 하나의 단위는 입력--> 연산 --> 출력을 담당하는 입력층(input layer)과 출력층(output layer) 그 사이에 연산을 담당하는 은닉층(hidden layer)로 구성된다. 이들이 어떠한 구조로 배치되는가가 신경망 이론의 중요한 부분이다.

위 그림과 같이 정보의 전달은 한방향으로 진행된다. 외부로 부터 입력층을 통해 정보가 투입되고 은닉층에서 학습(연산)이 이루어지고 그 결과를 출력층을 통해 외부로 전달된다.
입력층과 출력층은 단층으로 존재하지만 은닉층은 여러층으로 구성될 수 있다. 이러한 구조를 전방향신경망(feed forward neural network)이라고 합니다. 이외에도 많은 구조가 있습니다.

이러한 구조를 유지하면서 입력된 정보는 어떤 방식으로 연산 즉, 학습될까?
입력된 정보는 위에서 소개한 활성화 함수에서 연산되는데 중요하게 작용하는 것이 가중치이다. 그러므로 가중치를 설정하는 것에 의해 이후의 연산의 결과가 달라질 수 있다. 결과적으로 신경망 학습은 가중치 변화를 적절한 값으로 최적화 시키는 과정이라 할 수 있다. 이를 신경망 학습알고리즘이라 한다. 대부분의 학습알고리즘은 한 번의 수행으로 최적해를 찾을 수 없고 반복적인 수행을 통해 점차적으로 최적값을 갖도록 가중치를 수정하는 과정을 갖는다. 가중치를 수정하는 식은 다음과 같이 수식으로 표현할 수 있다.
$$ w(\tau +1) = w(\tau) + \delta w(\tau)$$
현시점 $\tau$에서의 가중치 $w(\tau)$가 새로운 가중치$w(\tau+1)$로 변화될때의 변화량$\delta w(\tau)$을 결정하는 방식은 학습 알고리즘 별로 다양하다.
여기서 학습알고리즘은 크게 지도학습(supervised learning)과 비지도학습(unsupervised learning)으로 구분할 수 있다.

아주 단순히 생각하면 이것의 기본 frame은 함수이다.

 x---> f(x) ---> y
입력 x에 대해 어떤 함수를 적용하여 결과 y를 산출하는 것이다. 이 과정에서 입력단에서 입력자들에 가중치를 적용하여 f(x)의 연산의 인자로 작용되는데 이 함수는 모든 인자에 대해 작용되는 것이 아니라 사전에 정의된 임계점 이상일 경우 수행된다. 결과적으로 최적의 가중치를 찾는 모형이 신경망의 중요한 부분이다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...