(*  책 '플랫폼 레볼루션' 독서 후 정리한 내용 )

 

부정적인 네트워크 효과를 방지하는 전략

종종 네트워크 성장은 부정적인 네트워크 효과를 양산하여 참여자들을 떠나게 만들고 심지어 플랫폼 비즈니스를 망하게 한다.

네트워크의 양적 성장으로 인해 생산자와 소비자간의 매칭이 제대로 이뤄지지 않으면 빠른 속도로 네트워크 이탈현상이 발생할 수 있다.

이런 현상을 피하기 위해서 자유로운 진입을 허용하되 효과적인 큐레이션을 통해 균형을 유지해야 한다.

큐레이션이란 플랫폼 사용자들의 활동, 관계를 필터링하고 통제, 제한하는 프로세스를 말한다.

효과적이고 잘 작동하는 큐레이션으로 유지시키려면 지속적인 테스트와 업데이트, 개선이 이루어져야 한다.

챗룰렛을 예로 들어 보자.

 

챗룰렛은 전 세계에 있는 사람들을 임의로 매칭하여 웹캠으로 대화할 수 있게 해준다. 이 사이트의 사용자는 6개월만에 약 150만명이 넘어섰다. 처음에는 가입요건이나 통제장치가 없었다. 자유로운 진입만이 있었음을 의미한다.

시간이 지나 벌거숭이 털북숭이 문제가 일어났다. 감시활동 없이 네트워크가 성장하자 다 벗은 털북숭이 남자들이 채팅에 나타나는 경우가 늘어났고 결국 많은 사람들이 네트워크를 떠나게 되었다.

지금은 사용자들이 다른 사용자들을 걸러낼 수 있을 뿐 아니라 알고리즘을 이용하여 불쾌한 이미지를 사용하는 접속자를 추려낸다.

 

성공적인 플랫폼이 되려면 성장의 어떤 지점에서는 반드시 효과적인 큐레이션 도입이 필요하다.

 

(*  책 '플랫폼 레볼루션' 독서 후 정리한 내용 )

무엇이 네트워크 효과를 극대화하는가

● 효과적인 플랫폼은 빠르고 쉽게 확장함으로써 네트워크 효과로부터 창출한 가치의 규모를 늘린다.

양면 네트워크(생산자와 소비자가 존재하는 네트워크)에서 확장성이 중요함을 알려주는 예는 야후와 구글이다.

 

야후는 처음에 사람이 직접 편집하는 데이터베이스로 시작했다. 웹페이지가 기하급수적으로 늘어나면서 웹페이지 등록을 신청하면 브라우저에 노출되기 까지 몇 주이상을 기다려야 하는 경우도 발생했다.

 

구글은 페이지 랭크 알고리즘을 이용하여 웹페이지 간의 연결고리를 찾아내고 중요도도 산정하여 빠르고 효과적으로 검색될 수 있도록 등록된다. 결국 구글의 알고리즘은 양면 네트워크의 생산자(웹페이지제작자)와 소비자(웹페이지 검색자) 모두를 만족시킨다. 네트워크가 점차 확장되더라도 랭크 알고리즘을 통하면 확장 이전의 서비스 그 이상의 품질을 제공할 수 있게 된다.

 

● 네트워크로의 "자유로운 진입"은 사용자가 플랫폼에 빠르고 쉽게 들어와 가치 창출 활동에 참여할 수 있게 해 준다. 플랫폼을 빠르게 성장할 수 있게 해 주는 핵심 요인이다.

 

스레드리스 사업모델을 예로 들어보자.

이 회사는 정보기술 서비스, 웹 디자인, 컨설팅 분야 전문가들이 설립한 티셔츠 회사이다.

이들은 매주 외부 참가자들 대상으로 디자인 컨테스트를 주최한 다음 가장 인기 있는 디자인의 티셔츠만 찍어서 고객층에게 판매한다. 이 모델을 통해 유명 디자이너나 마케팅에 큰 비용을 들이지 않고도 좋은 디자인의 티셔츠를 제작할 수 있게 된다. 컨테스트에 디자인을 제출하는 생산자나 평가하는 소비자들 모두 네트워크에 진입은 자유롭다. 

 

● 양면 네트워크가 건강하게 확장되려면 양쪽 시장이 동일한 비율로 성장해야 한다.

 

● 플랫폼 성장이 사이드 전환 효과에 의해 촉진되기도 한다

사이드 전환이란 플랫폼의 소비자가 생산자의 역할을 하게 되거나 반대로 생산자가 소비자 역할을 하게 되는 현상이다. 

예를 들어, 우버는 승객들 중 운전자를 모집하기도 하며, 에어비엔비는 게스트들 중에서 새로운 호스트를 모집한다.

 

 

 

(* DeepLearning from scratch2 서적을 학습한 후 정리한 내용임 )

역전파(back-propagation)를 살펴보기 전에 "계산 그래프"를 설명한다.

 

덧셈노드

위 그림은 z = x + y 식을 계산 그래프로 나타낸 것이다.

연산자 + 는 노드로 표시하고 입력과 출력을 화살표로 나타낸다.

계산그래프의 장점은 계산과정을 시각적으로 파악할 수 있다.

계산 그래프에서 연산자를 이용한 정상적인 계산 흐름을 순전파라고 한다.

역전파는 정상계산 흐름의 반대방향으로 흘러간다.

 

역전파 상황을 좀 더 자세히 살펴보기 위해 예를들어 설명한다.

z = x + y 계산 과정의 이전과 이후에 어떤 계산과정이 있다고 가정한다. 그리고 최종적으로는 스칼라 값인 L이 출력된다고 가정한다.

이 상황을 계산 그래프로 그리면 다음과 같다. 검은색 화살표가 순전파, 푸른색 화살표가 역전파를 나타낸다.

 

∂L/x 은 x가 L에 미치는 영향을 의미한다

x와 L 사이에는 복잡한 합성함수들이 들어있어 직접적으로 미분이 어려운 상황이다. 이런 경우 바로 앞절에서 언급한 연쇄법칙을 활용하여 계산한다

즉, 

∂L/∂x = ∂L/∂z * ∂z/∂x

여기서 ∂z/∂x 는 z = x + y 공식에서 계산이 가능하다.

 ∂z/∂x = 1

따라서,

∂L/∂x = ∂L/∂z * 1 이 된다.

 

∂L/∂y = ∂L/∂z * ∂z/∂y

∂z/∂y 는 z = x + y 공식에서 계산이 가능하다.

∂z/∂y = 1

따라서,

∂L/∂y = ∂L/∂z * 1 이 된다.

 

이 결과를 적용하면 역전파에서 덧셈노드는 상류로 부터 받은 미분값을 그대로 흘려보낸다.

 

계산 그래프를 구축하는 연산 노드로는 덧셈노드 외에 다양한 연산을 생각할 수 있다.

대표적인 연산노드 몇 가지를 소개한다

 

곱셈노드

z = x × y 를 계산그래프로 표현해보면 다음과 같다.

검은색 화살표는 순전파를 의미하며 푸른색 화살표는 역전파를 의미한다.

z = x × y 에 대해서 ∂L/∂x 값을 연쇄법칙을 이용하여 다음과 같이 정리할 수 있다.

z = x × y 에서 ∂z/∂x를 계산하면 

 

이 결과를 ∂L/∂x 공식에 대입하면 다음과 같다.

같은 방식으로 ∂L/∂y 에 대해 계산하면 결과는 다음과 같다.

결과적으로 곱셈노드의 역전파는 상류로부터 받은 기울기에 순전파시 입력을 서로 바꾼 값을 곱한다

 

분기노드

 

 

분기노드는 노드표시 원을 그리지 않고 선이 나뉘도록 그린다. 분기전의 입력값이 분기하면서 같은 값들이 복사되는 특징이 있다. 이런 이유때문에 "복제노드" 라고도 한다.

 

분기노드의 역전파는 위 그림에서 푸른색 화살표로 나타내고 있다.

상류에서 전달되어 온 미분값들을 하류로 흘러보낼 때 미분값(기울기)들을 합산하게 된다.

 

Repeat 노드

 

위의 2개로 분기하는 분기노드를 N개로의 분기로 확장할 수 있으며 이것을 "Repeat 노드" 라고 한다.

 

길이가 D인 배열을 N개로 복제하는 예

 

길이가 D인 배열을 N개 복제하는 Repeat 노드의 순전파

 

해당 그래프의 역전파는 아래와 같다.

 

길이가 D인 배열을 N개 복제하는 Repeat 노드의 역전분기

 

앞의 분기노드에서 설명했듯이 상류에서 흘러온 N개의 미분값(기울기)를 합산하여 하류로 흘려보낸다.

 

MatMul 노드

 

행렬의 곱셈을 MatMul(Maxtrix Multiply) 노드로 표현한다.

 

y = xW 라는 행렬곱셈 계산식을 생각해보자.

여기서 각 행렬의 형상은 다음과 같다.

x : 1 × D,  W : D × H,  y : 1 × H

 

x행렬의 i번째 원소에 대한 미분 ∂L/∂xi 는 다음과 같다.

이것은 xi를 (조금)변화시켰을 때 L이 얼마나 변할 것인가라는 "변화의 정도"를 나타낸다.

위 식이 나오게 된 과정을 좀 더 살펴보자.

각 행렬의 크기가 다음과 같다.

x : 1 × D,  W : D × H,  y : 1 × H 

여기서 

위 식에서 알 수 있듯이 xi는  y행렬의 모든 원소에 영향을 주고 있다.

 

(* DeepLearning from scratch2 서적을 학습한 후 정리한 내용임 )

 

신경망은 학습과정을 거쳐 손실값을 얻어낼 수 있다.

얻어진 손실값을 이용해 학습과정에 사용된 가중치 행렬의 기울기를 계산해낸다.

그리고 그 기울기를 이용해 가중치 각 원소값들을 조정한 후 학습을 진행한다. 그 결과로 나온 손실값을 이용해 기울기 계산을 하고 가중치 값을 조정한 후 다시 학습과정을 거친다. 이런 과정들을 반복하여 손실값을 줄여나가는 방향으로 가중치 값들을 최적화한다.

 

앞 절까지 과정에서 손실값을 얻어낼 수 있었다.

이제 가중치 행렬의 기울기를 계산해낼 차례다.

 

기울기를 계산하기 위해 오차역전파법(back - propagation)을 사용하게 된다.

오차역전파법의 핵심은 연쇄법칙이다.

 

예를 들어 연쇄법칙을 설명한다.

y = f(x) 와  z = g(y) 라는 두 함수가 있다고 가정한다.

z = g( f(x) ) 가 된다.

이 합성함수의 미분(x에 대한 z의 미분)은 다음의 공식이 된다.

 

즉 y에 대한 z 미분값과 x에 대한 y 미분값을 곱하면 x에 대한 z 미분값이 된다.

 

정리하면, 위의 가정이 조건으로 주어진 경우에 대해, 

x가 z에 미치는 영향도를 계산하기 위해서는 y에 대한 z 미분값과 x에 대한 y 미분값을 곱하면 된다.

 

이 법칙을 이용하게 되면 학습 과정이 합성함수들로 복잡하게 구성되어 있더라도 개별과정의 함수들을 미분한 값을 곱하면 전체 과정의 미분을 구할 수 있다.

 

 

(* DeepLearning from scratch2 서적을 학습한 후 정리한 내용임 )

 

y = f(x) 함수에서 "x에  관한 y의 미분"은 "∂y/x"라고 표현한다.

"x에 대한 y의 미분"은 "x를 조금 변화 시킬 때 y값이 변화하는 정도"를 의미한다. 또는 "y에 대한 x의 영향도" 를 의미한다. 수학적으로 보면 x의 임의의 위치에 대한 기울기를 의미하기도 한다.

L = f(x), L은 스칼라 값, x는 벡터인 경우 ,

x의 i번째 원소  xi 에 대한 L의 미분은 L / xi 이다.

따라서, 벡터 X에 대한 미분도 가능한다.

 

  L / x = (L/x1, L/x2, L/x3, .... L/xn)

 

위의 식처럼 벡터의 각 원소에 대한 미분을 정리한 것을 기울기라고 한다.

 

행렬에도 기울기를 생각할 수 있다.

W 가 m × n 행렬인 경우 L = g(W) 공식에 대한 미분 즉 기울기는 다음과 같다.

 

여기서 중요한 것은 W 와  L / W의 형상이 같다는 것이다.

즉  임의의 행렬 형상과 해당 행렬을 미분한 기울기 행렬의 형상이 같다

 

 

 

 

 

 

(* DeepLearning from scratch2 서적을 학습한 후 정리한 내용임 )

 

일반적으로 학습단계의 특정 시점에서 신경망의 성능을 나타내는 척도로 손실(loss)을 사용한다.

손실은 학습시 주어진 정답 데이터와 신경망이 예측한 결과를 비교하여 예측이 얼마나 나쁜가를 산출한 단일값이다.

 

다중 클래스 분류 신경망에서는 손실을 구하는 함수로 교차 엔트로피 오차(Cross Entropy Error)를 이용한다

앞 절에서 이야기 된 TwoLayerNet 모델에 SoftMax계층(SoftMax함수처리계층)과 Cross EntropyError계층(SoftMax처리결과와 정답데이터를 이용해 Cross Entropy Error를 계산하는 계층)을 추가한다.

 

추가된 계층을 포함한 구조도는 아래와 같다.

X는 입력 데이터, t는 정답 레이블, L은 손실을 의미한다.

 

소프트맥스 함수 공식은 다음과 같다.

위 식은 출력이 총 n개일 때, k번째 출력 Sk를 구하는 식이다. 즉, Sk는 k번째 클래스에 해당하는 소프트맥스 함수의 출력이다.

소프트맥스 함수 결과는 0.0이상 1.0 이하의 값을 가지는 실수이며 모든 출력들 n개의 S값을 합하면 1.0이 된다. 따라서 소프트맥스 함수 결과값을 확률로 해석할 수 있다.

 

손실값을 얻기 위해서는 소프트맥스 함수의 결과값을 입력으로 하여  Cross Entropy Error 함수 계산을 해야 한다.

공식은 아래와 같다.

여기서 tk는 k번째 클래스에 해당하는 정답레이블이다. log는 e를 밑으로 하는 로그이다.

또한 정답레이블은 t = [0, 0, 1]과 같은 원핫 벡터로 표기한다.

 

원핫벡터란 단 하나의 원소만 1이고 나머지 원소들은 모두 0인 벡터를 의미한다.

보통 신경망이 추론 결과가 숫자가 아닌 경우 결과로 나올 수 있는 모든 경우의 결과 개수만큼을 원소 개수로 가지는 벡터를 구성하고 각 경우의 결과와 매칭하여 원소 하나만 1로 하고 나머지는 0으로 하는 벡터를 구성한다. 이런 방식으로 구성된 벡터를 원핫벡터라고 한다. 예를 들면 결과값이 a, e, g, z 알파벳 4개 중 하나를 추론 해야 하는 신경망을 구성한다고 할 경우 결과 개수는 4개 (클래스 개수가 4개) 이므로 원소 개수가 4인 벡터를 구성하되 각 알파벳과 매칭되는 벡터들을 구성한다.

즉,

a = [1, 0, 0, 0]

e = [0, 1, 0, 0]

g = [0, 0, 1, 0]

z = [0, 0, 0, 1]

이렇게 구성된 벡터들을 원핫벡터(one hot vector)라고 하고 이런 처리 방식을 원핫 인코딩(one hot encoding) 이라고 한다

위의 Cross Entropy Error 공식을 입력 데이터가 N개 인 경우로 확장시키면 아래의 공식으로 구성할 수 있다.

여기서 tnk는 n번째 입력데이터에 대한 k번째 클래스 정답 원핫벡터를 의미한다

ynk는 n번째 입력데이터를 이용해 신경망 학습한 결과로 SoftMax 함수계산과정을 거쳐 나온 결과의 k번째 결과이다

 

N개의 입력데이터를 이용한 Cross Entropy Error 공식은 결국 각각의 입력 데이터에 대한 손실함수 결과를 N개만큼 합산하여 N으로 나눠 평균낸 것이다.

 

이 과정을 파이썬으로 구현할 때 Softmax with Loss 계층 하나로 구현한다.

 

(*  책 '플랫폼 레볼루션' 독서 후 정리한 내용 )

가격, 브랜드, 입소문으로는 한계가 있다

 

가격효과 - 할인과 쿠폰, 무료 이벤트 등의 가격을 낮춰 시장 점유율이 높아지는 효과

고급기능에 대해 유료화하는 프리미엄 방식으로 수익을 기대하지만 프리미엄을 신청하는 고객은 일반적으로 1~2%에 지나지 않는다. 결국 무리한 지출로 인해 폐업 확률이 높아진다.

 

브랜드 효과 - 브랜드 이미지를 구축하기 위해 많은 비용과 오랜 시간이 필요하게 되며 많은 기업들이 바라는 정도의 브랜드 이미지를 구축하기 전에 무리한 지출을 못 버티고 폐업할 확률이 높아진다.

 

바이럴리티(입소문) - 어떤 아이디어나 브랜드가 한 인터넷 사용자에서 다른 인터넷 사용자에게 급속도로 폭넓게 퍼지는 현상을 말한다. 바이럴리티는 사람들을 네트워크 안으로 끌어들이는 효과는 있다. 

네트워크 효과는 플랫폼 안에 있는 사람들 사이에서 가치를 늘리는 것이다.

 

2000년대 닷컴 호황이 내리막길을 걷기 시작할 무렵 성공기업과 실패기업 사례를 통해 연구한 결과

대부분의 실패기업들은 가격이나 브랜드 효과에 크게 의존했다는 것이다.

반면 성공한 기업은 네트워크 효과를 이용하여 사업을 확장해 나갔다.

 

 

앞의 신경망 추론 과정을 파이선과 넘파이를 이용해 구현해보자

가중치와 편향을 이용해 결과값을 도출하는 과정을 Affine(아핀) layer라고 정의한다
Affine layer 과정에서 나온 결과값을 Sigmoid 함수를 이용해 비선형화 하는 것을 Sigmoid layer라고 정의한다
앞에서 설명된 신경망 추론과정과 그에 매칭시켜 구현하기 위한 구성도는 아래와 같다.

구현 규칙 : 

파이썬을 이용해 위 모델을 구현시 Affine, Sigmoid 모두 클래스로 구현할 것이며 

각 클래스는 params, grads 속성을 갖도록 한다

params는 가중치 행렬과 편향행렬을 저장한다, 

grads는 params에 저장된 각 행렬에 대응되는 기울기(미분)행렬을 저장

각 클래스는 신경망 추론, 학습과정을 위해 대표 함수 forward를 제작하여 제공하도록 한다.

 

Affine layer 클래스 구현소스

class Affine:

       def __init__(self, W, b):

            self.params = [W, b]

 

       def forward(self, x):

            W, b = self.params

            out = np.matmul(x, W) + b

            return out

 

Sigmoid layer 클래스 구현소스

class Sigmoid:

       def __init__(self):

            self.params = []

 

       def forward(self, x):

            return 1 / (1 + np.exp(-x))

 

이제 신경망의 기본이 되는 위 두개 클래스 Affine과 Sigmoid를 이용하여 신경망 추론을 모델링한 클래스를 제작한다

이름은 TwoLayerNet 으로 한다

class TwoLayerNet:

 

        #클래스 생성자에서 입력층, 은닉층, 출력층의 행렬 사이즈를 입력받고 가중치, 편향 초기화

        #Layer들을 구성하여 params 속성에 가중치, 편향 행렬을 저장한다

       def __init__(self, input_size, hidden_size, output_size):

            I, H, O = input_size, hidden_size, output_size;

 

           #가중치와 편향 초기화

            Wh = np.random.randn(I, H)

            bh  = np.random.randn(H)

            Wy = np.random.randn(H, O)

            by  = np.random.randn(O)

 

            #계층 생성(위 구성도 기준으로 구현)

            self.layers = [

                    Affine(Wh, bh),

                    Sigmoid(),

                    Affine(Wy, by)

            ]

            #모든 가중치를 리스트에 모은다

            self.params = []

            for layer in self.layers:

                self.params += layer.params

 

     def predict(self, x):

          for layer in self.layers:

              x = layer.forword(x)

              return x

 

 

+ Recent posts