머신 러닝에 임베딩: 복잡한 데이터를 단순하게 만들기
게시 됨: 2022-03-11수치가 아닌 데이터로 작업하는 것은 숙련된 데이터 과학자에게도 어려울 수 있습니다. 일반적인 기계 학습 모델은 그 기능이 단어, 이메일, 웹사이트 페이지, 목록, 그래프 또는 확률 분포가 아닌 숫자일 것으로 예상합니다. 유용하려면 먼저 데이터를 벡터 공간으로 변환해야 합니다. 하지만 어떻게?
한 가지 인기 있는 접근 방식은 숫자가 아닌 기능을 categorical로 처리하는 것입니다. 범주 수가 적은 경우(예: 데이터가 직업이나 국가를 나타내는 경우) 이 방법이 효과적일 수 있습니다. 그러나 이 방법을 이메일에 적용하려고 하면 샘플 수만큼 많은 범주를 얻게 될 것입니다. 두 개의 이메일이 정확히 동일하지 않으므로 이 접근 방식은 아무 소용이 없습니다.
또 다른 접근 방식은 데이터 샘플 사이의 거리를 정의하는 것인데, 두 샘플이 얼마나 가까운지를 알려주는 함수입니다. 또는 두 개의 가까운 샘플 사이의 거리가 작은 반면 유사성은 크다는 점을 제외하고 동일한 정보를 제공하는 유사성 측정 을 정의할 수 있습니다. 모든 데이터 샘플 간의 거리(유사성)를 계산하면 거리(또는 유사성) 행렬을 얻을 수 있습니다. 이것은 우리가 사용할 수 있는 수치 데이터입니다.
그러나 이 데이터는 샘플 수만큼의 차원을 가지므로 일반적으로 특성으로 사용하거나(차원의 저주 참조) 시각화하려는 경우(하나의 플롯이 6D도 처리할 수 있지만 아직 100D 플롯을 보려면). 차원 수를 합리적인 양으로 줄일 수 있습니까?
대답은 예입니다! 그것이 우리가 임베딩 을 가지고 있는 이유입니다.
임베딩이란 무엇이며 왜 사용합니까?
임베딩은 고차원 데이터의 저차원 표현입니다. 일반적으로 임베딩은 원본 데이터에 포함된 모든 정보를 캡처하지 않습니다. 그러나 좋은 임베딩은 당면한 문제를 해결하기에 충분할 것입니다.
특정 데이터 구조에 맞춰진 많은 임베딩이 있습니다. 예를 들어 텍스트 데이터의 경우 word2vec, 모양 이미지 데이터의 경우 푸리에 설명자에 대해 들어본 적이 있을 것입니다. 대신 거리 또는 유사성 측정을 정의할 수 있는 데이터에 임베딩을 적용하는 방법에 대해 논의할 것입니다. 거리 행렬을 계산할 수 있는 한 데이터의 특성은 완전히 관련이 없습니다. 이메일, 목록, 나무 또는 웹 페이지와 동일하게 작동합니다.
이 기사에서는 다양한 유형의 임베딩을 소개하고 일부 인기 있는 임베딩이 작동하는 방식과 복잡한 데이터와 관련된 실제 문제를 해결하기 위해 임베딩을 사용하는 방법에 대해 논의합니다. 우리는 또한 이 방법의 장단점과 몇 가지 대안을 살펴볼 것입니다. 예, 일부 문제는 다른 방법으로 더 잘 해결할 수 있지만 불행히도 기계 학습에는 은총알이 없습니다.
시작하자.
임베딩 작동 방식
모든 임베딩은 데이터의 "필수" 정보를 보존하면서 데이터의 차원을 줄이려고 시도하지만 모든 임베딩은 고유한 방식으로 수행합니다. 여기에서는 거리 또는 유사성 행렬에 적용할 수 있는 몇 가지 인기 있는 임베딩을 살펴보겠습니다.
우리는 거기에 있는 모든 임베딩을 다루려고 하지도 않을 것입니다. 이를 수행할 수 있는 잘 알려진 임베딩이 12개 이상 있으며 덜 알려진 임베딩과 그 변형이 훨씬 더 많습니다. 각각에는 고유한 접근 방식, 장점 및 단점이 있습니다.
다른 임베딩이 무엇인지 보려면 여기에서 시작할 수 있습니다.
- Scikit-learn 사용자 가이드
- 통계 학습의 요소(2판), 14장
거리 행렬
거리 행렬에 대해 간단히 살펴보겠습니다. 데이터에 대한 적절한 거리를 찾으려면 문제에 대한 충분한 이해, 약간의 수학 지식, 때로는 순전한 운이 필요합니다. 이 기사에서 설명하는 접근 방식에서 이는 프로젝트의 전반적인 성공 또는 실패에 기여하는 가장 중요한 요소일 수 있습니다.
또한 몇 가지 기술적 세부 사항을 염두에 두어야 합니다. 많은 임베딩 알고리즘은 거리(또는 비유사성 ) 행렬 $\textbf{D}$가 대각선에 0이 있고 대칭이라고 가정합니다. 대칭이 아니면 $(\textbf{D} + \textbf{D}^T) / 2$를 대신 사용할 수 있습니다. 커널 트릭을 사용하는 알고리즘은 거리가 메트릭이라고 가정합니다. 즉, 삼각형 부등식이 성립합니다.
\[\a, b, c 모두 \;\; d(a,c) \leq d(a,b) + d(b,c)\]또한 알고리즘에 유사성 행렬이 대신 필요한 경우 단조 감소 기능을 적용하여 거리 행렬을 유사성 행렬로 변환할 수 있습니다(예: $\exp -x$).
주성분 분석(PCA)
주성분 분석(PCA)은 아마도 현재까지 가장 널리 사용되는 임베딩일 것입니다. 아이디어는 간단 합니다. 캡처된 분산을 최대화하거나 (동등하게) 2차 재구성 오류를 최소화하는 기능의 선형 변환을 찾습니다 .
구체적으로, 특성을 샘플 행렬 $\textbf{X} \in \mathbb{R}^{n \times p}$라고 하면 $n$ 특성과 $p$ 차원이 있습니다. 단순화를 위해 데이터 샘플 평균이 0이라고 가정해 보겠습니다. $\textbf{X}$에 직교 행렬 $\textbf{V}_q \in \mathbb{R}^{p \times q}$를 곱하여 차원 수를 $p$에서 $q$로 줄일 수 있습니다. :
\[\hat{\textbf{X}} = \textbf{X} \textbf{V}_q\]그러면 $\hat{\textbf{X}} \in \mathbb{R}^{n \times q}$가 새로운 기능 세트가 됩니다. 새로운 기능을 원래 공간에 다시 매핑하려면(이 작업을 재 구축이라고 함) $\textbf{V}_q^T$를 다시 곱하면 됩니다.
이제 재구성 오류를 최소화하는 행렬 $\textbf{V}_q$를 찾아야 합니다.
\[\min_{\textbf{V}_q} ||\textbf{X}\textbf{V}_q\textbf{V}_q^T - \textbf{X}||^2\]행렬 $\textbf{V}_q$의 열을 주성분 방향이라고 하고 $\hat{\textbf{X}}$의 열을 주성분이라고 합니다. 수치적으로, 우리는 $\textbf{X}$에 SVD 분해를 적용하여 $\textbf{V}_q$를 찾을 수 있지만, 똑같이 유효한 다른 방법이 있습니다.
PCA는 수치적 특징에 직접 적용될 수 있습니다. 또는 기능이 숫자가 아닌 경우 거리 또는 유사성 행렬에 적용할 수 있습니다.
Python을 사용하는 경우 PCA는 scikit-learn에서 구현됩니다.
이 방법 의 장점 은 계산이 빠르고 데이터의 노이즈에 매우 강하다는 것입니다.
단점 은 선형 구조만 캡처할 수 있으므로 원본 데이터에 포함된 비선형 정보가 손실될 가능성이 있다는 것입니다.
커널 PCA
커널 PCA는 PCA의 비선형 버전입니다. 아이디어는 Support Vector Machines SVM에 익숙하다면 들어봤을 커널 트릭 을 사용하는 것입니다.
특히 PCA를 계산하는 몇 가지 다른 방법이 있습니다. 그 중 하나는 그램 행렬 $\textbf{X} \textbf{X}^T \in \mathbb{R}^{n \times n}$의 이중 중심 버전의 고유 분해를 계산하는 것입니다. 이제 데이터에 대한 커널 행렬 $\textbf{K} \in \mathbb{R}^{n \times n}$를 계산하면 Kernel PCA는 주성분을 찾기 위해 이를 그램 행렬로 처리합니다.
$x_i$, $i \in {1,..,n}$를 특징 샘플이라고 하자. 커널 행렬은 커널 함수 $K(x_i,x_j)=\langle \phi(x_i),\phi(x_j) \rangle$로 정의됩니다.
인기 있는 선택은 방사형 커널입니다.
\[K(x_i,x_j)=\exp -\감마 \cdot d(x_i,x_j)\]여기서 $d$는 거리 함수입니다.
커널 PCA에서는 거리를 지정해야 했습니다. 예를 들어 수치 기능의 경우 유클리드 거리를 사용할 수 있습니다. $d(x_i,x_j)=\vert\vert x_i-x_j \vert \vert ^2$.
숫자가 아닌 기능의 경우 창의력이 필요할 수 있습니다. 한 가지 기억해야 할 점은 이 알고리즘은 거리를 메트릭으로 가정한다는 것입니다.
Python을 사용하는 경우 Kernel PCA는 scikit-learn에서 구현됩니다.
Kernel PCA 방법 의 장점 은 비선형 데이터 구조를 캡처할 수 있다는 것입니다.
단점 은 데이터의 노이즈에 민감하고 거리 및 커널 기능의 선택이 결과에 큰 영향을 미친다는 것입니다.
다차원 스케일링(MDS)
다차원 척도법(MDS)은 전 세계적으로 샘플 간의 거리를 유지하려고 합니다. 이 아이디어는 매우 직관적이며 거리 행렬과 잘 작동합니다.
구체적으로, 특징 샘플 $x_i$, $i \in {1,..,n}$ 및 거리 함수 $d$가 주어지면 새로운 특징 샘플 $z_i \in \mathbb{R}^{q}$, $i \in {1,..,n}$ 스트레스 함수 최소화:
\[\min_{z_1,..,z_n} \sum_{1 \leq i < j \leq n} (d(x_i, x_j) - ||z_i - z_j||)^2\]Python을 사용하는 경우 MDS는 scikit-learn에서 구현됩니다. 그러나 scikit-learn은 회귀 또는 분류 모델과 함께 임베딩을 사용하려는 경우 불편할 수 있는 샘플 외 점의 변환을 지원하지 않습니다. 그러나 원칙적으로는 가능합니다.
MDS 의 장점 은 그 아이디어가 우리 프레임워크와 완벽하게 일치하고 데이터의 노이즈에 크게 영향을 받지 않는다는 것입니다.
단점 은 scikit-learn에서의 구현이 상당히 느리고 샘플 외 변환을 지원하지 않는다는 것입니다.

사용 사례: 배송 추적
작은 열대 섬의 몇몇 정착촌은 지역 관광 산업을 수용하기 위해 소포 배송 서비스를 개발했습니다. 이 정착지 중 한 곳의 상인은 경쟁에서 우위를 점하기 위해 조치를 취하기로 결정하고 섬의 모든 소포 선적을 추적하는 위성 감시 시스템을 설정했습니다. 데이터가 수집되면 판매자는 데이터 과학자(저희입니다!)에게 전화를 걸어 다음 질문에 답하는 데 도움을 주었습니다. 현재 운송 중인 패키지의 목적지를 예측할 수 있습니까?
데이터 세트에는 200개의 추적된 배송에 대한 정보가 포함되어 있습니다. 추적된 모든 배송에 대해 패키지가 발견된 모든 위치의 (x,y) 좌표 목록이 있으며, 일반적으로 20~50개의 관찰 결과가 있습니다. 아래 도표는 이 데이터가 어떻게 보이는지 보여줍니다.
이 데이터는 실제로 문제의 두 가지 다른 유형의 문제처럼 보입니다.
첫 번째 문제는 우리가 다루고 있는 데이터가 고차원이라는 것입니다. 예를 들어, 모든 패키지가 50개 위치에서 발견된 경우 데이터에는 100개의 차원이 있습니다.
두 번째 문제: 다른 선적 경로는 실제로 다른 수의 관찰을 가지므로 테이블 형식으로 데이터를 나타내기 위해 좌표와 함께 목록을 단순히 쌓을 수 없습니다.
상인은 조급하게 테이블을 손가락으로 두드리고 있으며 데이터 과학자는 당황할 기미가 보이지 않도록 열심히 노력하고 있습니다.
여기에서 거리 행렬과 임베딩이 유용할 것입니다. 두 개의 배송 경로를 비교할 방법을 찾기만 하면 됩니다. 프레셰 거리는 합리적인 선택인 것 같습니다. 거리를 사용하여 거리 행렬을 계산할 수 있습니다.
참고: 이 단계는 시간이 걸릴 수 있습니다. $O(k^2)$ 반복을 갖는 각 거리로 $O(n^2)$ 거리를 계산해야 합니다. 여기서 $n$은 샘플 수이고 $k$는 한 샘플의 관측값 수입니다. 거리 함수를 효율적으로 작성하는 것이 핵심입니다. 예를 들어, Python에서 number를 사용하여 이 계산을 몇 배로 가속화할 수 있습니다.
임베딩 시각화
이제 임베딩을 사용하여 차원 수를 200에서 몇 개로 줄일 수 있습니다. 우리는 무역 루트가 소수에 불과하다는 것을 분명히 알 수 있으므로 2차원 또는 3차원에서도 데이터의 좋은 표현을 찾을 수 있기를 바랄 수 있습니다. 우리는 앞서 논의한 임베딩(PCA, Kernel PCA, MDS)을 사용할 것입니다.
아래 플롯에서 레이블이 지정된 경로 데이터(시연을 위해 제공됨)와 2D 및 3D(왼쪽에서 오른쪽으로)의 임베딩에 의한 표현을 볼 수 있습니다. 라벨이 붙은 데이터는 6개의 무역로로 연결된 4개의 무역 기지를 표시합니다. 6개 교역로 중 2개는 양방향이어서 총 8개 선적 그룹(6+2)을 구성합니다. 보시다시피, 3D 임베딩을 사용하여 8개의 배송 그룹을 모두 명확하게 구분했습니다.
좋은 시작입니다.
모델 파이프라인에 임베딩
이제 임베딩을 훈련할 준비가 되었습니다. MDS가 최상의 결과를 보여주긴 했지만 속도가 다소 느립니다. 또한 scikit-learn의 구현은 샘플 외 변환을 지원하지 않습니다. 연구에는 문제가 없지만 프로덕션에는 문제가 될 수 있으므로 Kernel PCA를 대신 사용합니다. Kernel PCA의 경우 사전에 거리 행렬에 방사형 커널을 적용하는 것을 잊지 말아야 합니다.
출력 차원의 수는 어떻게 선택합니까? 분석 결과 3D도 제대로 작동하는 것으로 나타났습니다. 중요한 정보를 빠뜨리지 않고 안전하게 하기 위해 임베딩 출력을 10D로 설정합시다. 최상의 성능을 위해 출력 차원의 수를 모델 하이퍼 매개변수로 설정한 다음 교차 검증을 통해 조정할 수 있습니다.
따라서 우리는 거의 모든 분류 모델에 대한 입력으로 사용할 수 있는 10개의 숫자 기능을 갖게 됩니다. 하나의 선형 모델과 하나의 비선형 모델은 어떻습니까? 예를 들어 Logistic Regression 및 Gradient Boosting? 비교를 위해 입력으로 전체 거리 행렬이 있는 이 두 모델도 사용하겠습니다. 그 위에 SVM도 테스트해 보겠습니다(SVM은 거리 행렬과 직접 작동하도록 설계되었으므로 포함할 필요가 없습니다).
테스트 세트의 모델 정확도는 다음과 같습니다(모델의 분산을 추정할 수 있도록 10개의 훈련 및 테스트 데이터 세트가 생성됨).
- 임베딩(KernelPCA+GB)과 결합된 그래디언트 부스팅 이 1위를 차지했습니다. 임베딩(GB)이 없는 Gradient Boosting보다 성능이 뛰어납니다. 여기에서 Kernel PCA가 유용한 것으로 판명되었습니다.
- 로지스틱 회귀 는 괜찮았습니다. 흥미로운 점은 임베딩이 없는 로지스틱 회귀(LR)가 임베딩(KernelPCA+LR)보다 더 우수하다는 것입니다. 이것은 완전히 예상치 못한 것이 아닙니다. 선형 모델은 매우 유연하지는 않지만 상대적으로 과대적합하기 어렵습니다. 여기서 임베딩으로 인한 정보 손실은 입력 차원이 작아지는 이점보다 더 큰 것으로 보입니다.
- 마지막으로 중요한 것은 이 모델의 분산이 상당히 중요함에도 불구하고 SVM 도 잘 수행되었다는 점입니다.
모델 정확도
이 사용 사례에 대한 Python 코드는 GitHub에서 사용할 수 있습니다.
결론
임베딩이 무엇인지 설명하고 실제 문제를 해결하기 위해 거리 행렬과 함께 임베딩을 사용하는 방법을 시연했습니다. 판결 시간:
임베딩은 데이터 과학자가 사용해야 하는 것입니까? 이야기의 양면을 살펴보자.
임베딩 사용의 장단점
장점:
- 이 접근 방식을 사용하면 특정 수준의 지식, 상상력 및 운이 있으면 일반적으로 할 수 있는 거리를 정의할 수 있는 한 독특하거나 복잡한 데이터 구조로 작업할 수 있습니다.
- 출력은 저차원 수치 데이터로, 쉽게 분석, 클러스터링 또는 거의 모든 기계 학습 모델의 모델 기능으로 사용할 수 있습니다.
단점:
이 접근 방식을 사용하면 일부 정보가 반드시 손실됩니다.
- 첫 번째 단계에서 원본 데이터를 유사도 행렬로 대체할 때
- 두 번째 단계에서 임베딩을 사용하여 차원을 줄이면
- 데이터 및 거리 함수에 따라 거리 행렬 계산에 시간이 많이 소요될 수 있습니다. 이것은 효율적으로 작성된 거리 함수에 의해 완화될 수 있습니다.
- 일부 임베딩은 데이터의 노이즈에 매우 민감합니다. 이는 추가 데이터 정리를 통해 완화될 수 있습니다.
- 일부 임베딩은 하이퍼 매개변수 선택에 민감합니다. 이것은 신중한 분석이나 하이퍼파라미터 조정으로 완화될 수 있습니다.
대안: 사용하지 않는 이유는...?
- 거리 행렬이 아닌 데이터에 직접 임베딩을 사용하는 것이 어떻습니까?
데이터를 직접 효율적으로 인코딩할 수 있는 임베딩을 알고 있다면 꼭 사용하세요. 문제는 그것이 항상 존재하는 것은 아니라는 것입니다. - 거리 행렬에서 클러스터화를 사용하지 않는 이유는 무엇입니까?
유일한 목표가 데이터세트를 분할하는 것이라면 그렇게 해도 무방합니다. 일부 클러스터화 방법은 임베딩도 활용합니다(예: 스펙트럼 클러스터링). 더 자세히 알아보려면 클러스터화에 대한 자습서가 있습니다. - 거리 행렬을 특징으로 사용하지 않는 이유는 무엇입니까?
거리 행렬의 크기는 $(n_{samples}, n_{samples})$입니다. 모든 모델이 이를 효율적으로 처리할 수 있는 것은 아닙니다. 일부는 과적합될 수 있고 일부는 적합하지 않을 수 있으며 일부는 완전히 적합하지 않을 수 있습니다. 선형 및/또는 정규화 모델과 같이 분산이 낮은 모델이 좋은 선택이 될 것입니다. - 거리 행렬과 함께 SVM을 사용하지 않는 이유는 무엇입니까?
SVM은 우리의 사용 사례에서 잘 수행된 훌륭한 모델입니다. 그러나 몇 가지 주의 사항이 있습니다. 첫째, 다른 기능을 추가하려는 경우(단순한 숫자일 수 있음) 직접 수행할 수 없습니다. 우리는 그것들을 우리의 유사성 매트릭스에 통합해야 했고 잠재적으로 일부 귀중한 정보를 잃어버렸을 것입니다. 둘째, SVM이 좋은 만큼 다른 모델이 특정 문제에 더 잘 작동할 수 있습니다. - 왜 딥 러닝을 사용하지 않습니까?
어떤 문제에 대해서도 충분히 오래 검색하면 적합한 신경망을 찾을 수 있다는 것은 사실입니다. 그러나 이 신경망을 찾고, 훈련하고, 검증하고, 배포하는 과정이 반드시 간단한 것은 아니라는 점을 명심하십시오. 따라서 언제나처럼 최선의 판단을 내리십시오.
한 문장으로
거리 행렬과 함께 임베딩은 복잡한 비숫자 데이터로 작업하는 경우, 특히 데이터를 벡터 공간으로 직접 변환할 수 없고 모델에 대한 저차원 입력을 선호하는 경우 매우 유용한 도구입니다.