회귀 함수를 기반으로 최적 회귀 함수를 도출하지 않고 결정 트리를 기반으로 하는 회귀 방식을 소개하겠습니다. 회귀 트리는 분류 트리와 달리 리프 노드에 속한 데이터 값의 평균값을 구해 회귀 예측값을 계산합니다. 데이터 세트의 X 피처를 결정 트리 기반으로 분할하면 X값의 균일도를 반영한 지니계수에 따라 다음 그림의 왼쪽과 같이 분할할 수 있습니다. 루트 노드를 Split 0을 기준으로 분할하고 이렇게 분할된 규칙노드에서 다시 Split1과 Split2 규칙 노드로 분할할 수 있습니다. 그리고 Split 2는 다시 재귀적으로 Split3 규칙 노드로 다음 그림의 오른쪽과 같이 트리 규칙으로 변환될 수 있습니다. 리프 노드 생성 기준에 부합하는 트리 분할이 완료됐다면 리프 노드에 소속된 데이터 값의 평균값을 구해서 최종적으로 리프 노드에 결정 값으로 할당합니다. 결정트리, 랜덤 포레스트,GBM,XGBoost,LightGBM 등의 앞 4장의 분류에서 소개한 모든 트리 기반의 알고리즘은 분류뿐만 아니라 회귀도 가능합니다. 트리 생성이 CART(Classification and Regression Trees)는 이름에서도 알 수 있듯이 분류뿐만 아니라 회구도 가능하게 해주는 트리 생성 알고리즘입니다. 사이킷런에서는 결정트리, 랜덤 포레스트, GBM에서 CART 기반의 회귀 수행을 할 수 있는 Estimator 클래스를 제공합니다. 또한 XGBoost,LightGBM도 사이킷런 래퍼 클래스를 통해 이를 제공합니다. 회귀 트리 Regressor 클래스는 선형 회귀와 다른 처리 방식이므로 회귀 계수를 제공하는 $coef_$ 속성이 없습니다. 대신 $feature_importance_$를 이용해 피처별 중요도를 알 수 있습니다.
참고자료 https://publications.aston.ac.uk/id/eprint/373/1/NCRG_94_004.pdf 1. 기존 딥러닝 일반적인 회귀 신경망은 입력 벡터 $\mathbf{x}$를 받아 목표 벡터 $\mathbf{t}$의 각 성분에 해당하는 출력 $f_k(\mathbf{x};\mathbf{w})$를 계산합니다. MSE로 학습할 때의 오차 함수는 다음과 같습니다. $$ \frac{1}{2} \sum_{q=1}^{n}\sum_{k=1}^{c} \left[ f_k(\mathbf{x}^{q};\mathbf{w})-t_k^{q} \right]^2 $$ 데이터가 충분히 많고 모델이 데이터를 잘 표현할 수 있을 때 데이터에 대한 합을 결합확률밀도 $p(\mathbf{t},\mathbf{x})$를 이용한 적분으로 나타낼 수 있습니다. $$ \begin{aligned} E &= \lim_{n\to\infty} \frac{1}{2n}\sum_{q=1}^{n}\sum_{k=1}^{c}[f_k(\mathbf{x}^q;\mathbf{w})-t_k^q]^2 \ &= \frac{1}{2}\sum_{k=1}^{c}\iint [f_k(\mathbf{x};\mathbf{w})-t_k]^2, p(\mathbf{t},\mathbf{x}),d\mathbf{t},d\mathbf{x} \end{aligned} $$ 고정된 입력 $\mathbf{x}$에서 이 오차를 최소화하는 출력값을 구해보면 $p(\mathbf{t},\mathbf{x})=p(\mathbf{t}\mid\mathbf{x})p(\mathbf{x})$를 이용하고 $f_k(\mathbf{x};\mathbf{w})$에 대해 미분하면 다음과 같습니다. $$ \int \left[ f_k(\mathbf{x};\mathbf{w})-t_k \right] p(\mathbf{t}\mid\mathbf{x})d\mathbf{t} =0 $$ 조건부 확률밀도의 적분값은 1입니다. 따라서 출력값은 $$ \langle t_k\mid\mathbf{x}\rangle = \int t_k,p(\mathbf{t}\mid\mathbf{x}),d\mathbf{t} $$ MSE로 학습한 신경망의 $k$번째 출력은 입력 $\mathbf{x}$가 주어졌을 때 목표값 $t_k$의 조건부 평균입니다. 하지만 하나의 입력에 대해 목표값이 여러개라면 어떻게 될까요? 2. inverse problem 어떤 과정에서는 같은 결과가 서로 다른 원인에서 나올 수도 있습니다. 이렇게 관측된 결과로부터 그 결과를 만들어 낸 원인을 추정하는 문제를 inverse problem(역문제)이라고 합니다. 결과가 같더라도 가능한 원인이 여러 개라면, 하나의 입력에 여러 목표값이 대응하게 됩니다 이제 관측된 결과를 신경망의 입력 $\mathbf{x}$ 추정할 원인을 목표값 $\mathbf{t}$라고 두겠습니다. 어떤 입력 $\mathbf{x}_0$에 대해 서로 다른 두 목표값 $\mathbf{t}_1$, $\mathbf{t}_2$가 모두 가능하다고 하였을 때 MSE 회귀 신경망은 하나의 출력값만 예측합니다. 두 목표값이 비슷한 빈도로 나타난다면 $k$번째 출력은 대략 다음과 같습니다. $$ \langle t_k\mid\mathbf{x}0\rangle \approx \frac{t_{1,k}+t_{2,k}}{2} $$ 이 출력의 문제점은 출력값이 두 개의 원인 모두와 값이 달라 어느 쪽에도 해당하지 않을 수 있다는 점입니다. 이와 같은 역문제에서는 평균값 하나를 예측하는 것보다 주어진 입력에서 어떤 목표값들이 얼마나 가능한지를 나타내는 조건부 분포 $p(\mathbf{t}\mid\mathbf{x})$를 모델링할 필요가 있습니다. 이것이 다음 절에서 살펴볼 MDN의 출발점입니다. 3. MDN 문제는 신경망이 입력 $\mathbf{x}$에 대해 목표값 하나만 출력한다는 데 있습니다. Mixture Density Network(MDN) 는 목표값 하나 대신 조건부 확률밀도 $p(\mathbf{t}\mid\mathbf{x})$를 모델링합니다. 따라서 같은 입력에서 여러 목표값이 가능한 상황도 표현할 수 있습니다. MDN은 신경망과 혼합모형으로 구성됩니다. 신경망은 입력 $\mathbf{x}$를 받아 혼합모형의 파라미터를 출력하고 혼합모형은 이 파라미터를 사용해 목표값 $\mathbf{t}$의 확률밀도를 만듭니다. 가우시안 성분을 $m$개 사용하면 다음과 같습니다. $$ \sum_{i=1}^{m} \alpha_i(\mathbf{x}) \phi_i(\mathbf{t}\mid\mathbf{x}) $$ $\phi_i(\mathbf{t}\mid\mathbf{x})$는 $i$번째 가우시안의 확률밀도이고 $\alpha_i(\mathbf{x})$는 그 성분의 혼합계수입니다. 각 성분은 입력에 따라 다음 세 가지 값을 가집니다. $\alpha_i(\mathbf{x})$: 해당 성분이 차지하는 비중 $\boldsymbol{\mu}_i(\mathbf{x})$: 해당 성분의 중심 $\sigma_i(\mathbf{x})$: 해당 성분의 퍼짐 정도 목표 벡터 $\mathbf{t}$의 차원이 $c$일 때 자료에서 사용한 가우시안 성분은 다음과 같습니다. $$ \frac{1}{(2\pi)^{c/2}\sigma_i(\mathbf{x})^c} \exp\left( -\frac{|\mathbf{t}-\boldsymbol{\mu}_i(\mathbf{x})|^2} {2\sigma_i(\mathbf{x})^2} \right) $$ 혼합계수는 확률의 비중이어서 $\alpha_i(\mathbf{x})\geq 0$, $\sum_{i=1}^{m}\alpha_i(\mathbf{x})=1$이어야 합니다. 이를 위해 신경망의 혼합계수 출력을 softmax에 통과시킵니다. 이 구조에서는 한 입력에 대해 가능한 목표값이 두 군데에 모여 있을 때 두 가우시안의 중심을 각각의 목표값 근처에 둘 수 있습니다. 기존 MSE 회귀 모델은 두 값 사이의 평균을 하나의 답으로 출력하지만 MDN은 두 영역 모두에서 목표값이 나올 수 있음을 분포로 표현합니다. 각 영역의 비중과 퍼짐 정도도 함께 나타낼 수 있습니다. 4. software implementation Mixture Density Network도 일반적인 신경망과 같은 방법으로 학습합니다. 신경망이 혼합분포의 파라미터를 출력하면 오차 함수가 그 파라미터와 목표값을 이용해 손실 및 출력층의 기울기를 계산합니다. 이후에는 이 기울기를 신경망에 역전파하여 가중치를 조정합니다. MSE 회귀에서는 예측값과 목표값의 차이 제곱을 오차로 사용했습니다. MDN은 입력 $\mathbf{x}^{q}$가 주어졌을 때 실제 목표값 $\mathbf{t}^{q}$에 모델이 얼마나 높은 확률밀도를 부여하는지 평가합니다. $q$번째 데이터의 손실은 음의 로그 가능도입니다. $$ E^q = -\ln p(\mathbf{t}^q|\mathbf{x}^q) = -\ln\left[\sum_{i=1}^{m}\alpha_i(\mathbf{x}^q)\phi_i(\mathbf{t}^q|\mathbf{x}^q)\right] $$ 신경망의 출력 벡터를 $\mathbf{z}^{q}$라고 하겠습니다. 이 출력으로부터 혼합계수 $\alpha_i$ 평균 $\boldsymbol{\mu}_i$ 표준편차 $\sigma_i$를 계산합니다. 오차 함수는 $\mathbf{z}^{q}$와 목표값 $\mathbf{t}^{q}$를 받아 손실 $E^q$ 및 출력에 대한 기울기 $\boldsymbol{\delta}^{q}=\nabla{\mathbf{z}^{q}}E^q$를 반환합니다. 가중치를 조정하려면 먼저 실제 목표값 $\mathbf{t}^{q}$에 대해 각 가우시안 성분이 얼마나 기여했는지 계산합니다. 이를 $i$번째 성분의 책임도라고 합니다. $$ \frac{ \alpha_i(\mathbf{x}^{q}) \phi_i(\mathbf{t}^{q}\mid\mathbf{x}^{q}) }{ \sum_{j=1}^{m} \alpha_j(\mathbf{x}^{q}) \phi_j(\mathbf{t}^{q}\mid\mathbf{x}^{q}) } $$ 책임도를 이용하면 손실을 신경망의 출력인 혼합계수, 평균, 표준편차에 대해 미분할 수 있습니다. 이렇게 구한 출력층의 기울기를 일반적인 역전파 알고리즘과 동일하게 사용하면 됩니다. $$ \sum_j \frac{\partial E^q}{\partial z_j^q} \frac{\partial z_j^q}{\partial w} $$
Opus 5.5 发布后,网友都抢着试用。一刷就是好几个作品,从网页、动画到游戏等等。这些都比 benchmark 的数值直观,有的还能自己上手试试。一位名为 MiaAI Lab 的创作者直接让 Opus 5.5「做 100 个 HTML 文件」,附带三条要求:好看、设计不要重复、充分发挥创意。做出来的成品十分惊人。 阅读全文