당신이 나와 같다면, 당신은 음악을 좋아합니다. 나는 음악을 사랑하고 새로운 음악을 찾는 것을 좋아합니다. Spotify는 인터넷상의 최고의 음악 스트리밍 서비스 중 하나이며, 귀하가 듣는 음악을 기반으로 새로운 음악을 발견하는 데 도움이 되는 놀라운 도구가 이미 포함되어 있습니다. 이는 사용자 간의 유사한 사용을 추적하고 노래에 연결된 정보 간의 유사한 정보를 기반으로 새로운 노래를 추천하는 콘텐츠 기반 추천 또는 추천을 생성하는 데 사용되는 협업 필터링을 포함한 다양한 알고리즘의 조합을 통해 수행됩니다. 노래처럼요? Spotify에서는 해당 노래의 '라디오'를 들을 수 있습니다. 라디오는 어떤 방식으로든 또는 여러 방식을 조합하여 해당 노래와 유사한 노래 그룹을 수집합니다. 노래가 마음에 들지만 그 안에 담긴 소리 이외의 정보에는 관심이 없다면 어떨까요? 때로는 그것이 내가 듣고 싶은 전부입니다.
음악 소리만으로 정보를 기반으로 음악 추천 시스템을 만들고자 이 프로젝트를 만들었습니다. 비슷한 소리의 노래를 통해 사용자가 새로운 음악을 찾는 데 도움이 됩니다. 이를 위해 모든 음악 간의 유사성을 탐구하고 노래의 음색, 리듬 및 스타일을 수학적으로 포착하려고 시도합니다.
소리는 항상 우리 주변에 있습니다. 우리는 살아가면서 다른 사람들의 소리를 구별하는 능력을 키우게 됩니다. 음악도 다르지 않습니다. 음악에는 다양한 유형이 있으며, 음악은 종종 우리가 다른 것과 구별할 수 있는 다양한 종류의 소리와 리듬의 조합입니다. 하지만 우리가 그 정보를 스스로 수량화할 수 있을까요? 때때로 음악은 장르로 분류됩니다. 즉, 장르는 스타일, 형식, 리듬, 음색, 악기 또는 문화 면에서 유사한 특성을 가진 음악가 그룹을 의미합니다. 하지만 모든 음악가가 같은 장르의 사운드를 만들어내는 것은 아니며, 모든 장르가 같은 종류의 음악을 포함하는 것도 아닙니다. 그렇다면 소리란 무엇이고, 다양한 유형의 소리를 어떻게 구분할 수 있을까요?
소리는 음파가 고막을 진동할 때 귀를 통해 감지되는 음향파의 진동입니다. 음파는 신호이며 해당 신호가 진동하는 속도를 주파수라고 합니다. 소리의 주파수가 높으면 우리는 그 소리의 음조가 더 높다고 인식합니다. 음악에서 베이스나 베이스 드럼과 같은 악기는 낮은 주파수에서 진동하는 소리를 생성하는 반면 높은 음조는 더 높은 주파수를 갖습니다. 심벌즈나 하이햇의 충돌과 같은 소리는 서로 다른 주파수의 많은 파동의 조합이며 '시끄럽고' 거의 임의적으로 보이는 파동으로 표현됩니다.
소리는 어떤 것 같나요? 소리를 시각화할 수 있는 한 가지 방법은 시간에 따른 신호를 플로팅하는 것입니다.
각 서브플롯의 시간 창을 단축하면 오디오 신호를 훨씬 더 가깝게 볼 수 있습니다. 가장 확대된 신호 이미지에서 파동은 서로 다른 주파수의 집합임을 알 수 있습니다. 더 작은 고주파 신호와 결합되는 하나의 저주파 신호가 있을 수 있습니다.
따라서 시간이 지남에 따라 신호를 시각화할 수 있지만 이 시각화를 보는 것만으로는 해당 음파에 대해 많은 것을 이해하기 어렵다는 것을 이미 알 수 있습니다. 0.01초 창에는 어떤 종류의 주파수가 존재합니까? 이에 답하기 위해 푸리에 변환을 사용하여 스펙트로그램을 계산하겠습니다.
푸리에 변환은 오디오 신호 섹션에 존재하는 주파수의 진폭을 계산하는 방법입니다. 위 그래프에서 볼 수 있듯이 파동은 복잡할 수 있으며 신호의 각 변화는 서로 다른 주파수(진동 속도)를 나타냅니다. 푸리에 변환은 본질적으로 각 시간 섹션의 주파수를 추출하고 시간에 대한 주파수 진폭의 2차원 배열을 생성합니다. 푸리에 변환의 결과는 스펙트로그램입니다. 스펙트로그램에서 생성된 주파수를 멜 스케일로 변환하여 멜 스펙트로그램을 만듭니다. 멜 스펙트로그램은 우리가 들을 때 인식되는 주파수 사이의 거리를 더 잘 나타냅니다.
위에서 플롯한 것과 동일한 오디오 샘플의 멜 스펙트로그램 예를 플롯해 보겠습니다.
Spotify의 Public API를 사용하여 이전 노트북의 노래 정보를 스크랩했습니다. 여기에서 각 노래의 30초짜리 mp3 미리보기를 다운로드하고 이를 멜 스펙트로그램으로 변환하여 이미지를 학습하는 신경망에서 사용할 수 있습니다. 먼저 mp3 미리보기를 수집하는 데 사용할 데이터 프레임을 살펴보겠습니다.
다른 노트북에서는 Spotify API의 미리보기 링크를 가져와서 mp3를 다운로드하고 사운드 파일을 멜 스펙트로그램, 멜 주파수 켑스트럴 계수 및 크로마그램이 포함된 합성 이미지로 변환했습니다. 저는 이러한 다른 변환을 사용할 의도로 이 합성 이미지를 만들었습니다. 하지만 이 프로젝트에서는 멜 스펙트로그램에 대한 신경망만 훈련할 것입니다.
사운드 내용만으로 유사한 노래를 추천하려면 노래의 내용을 어떻게든 설명하는 기능을 만들어야 합니다. 또한 이 작업을 빠르게 수행하려면 각 노래의 정보를 멜 스펙트로그램의 입력보다 더 작은 숫자 집합으로 압축해야 합니다.
각 노래 미리보기 파일에는 600,000개가 넘는 샘플이 있습니다. 각 멜 스펙트로그램에는 512 x 128 픽셀, 총 65,536 픽셀이 있습니다. 128x128 이미지에도 16,384픽셀이 포함됩니다. 이 자동 인코더 모델은 노래의 내용을 256개의 숫자로 압축합니다. 오토인코더가 충분히 훈련되면 네트워크는 손실을 최소화하면서 길이 256의 벡터에서 노래를 재구성할 수 있습니다.
오토인코더 는 인코더 와 디코더 로 구성된 일종의 신경망입니다. 첫째, 인코더는 입력 정보를 훨씬 더 적은 양의 데이터로 압축하고 디코더는 가능한 한 원래 출력에 가깝게 데이터를 재구성합니다.
오토인코더는 완전히 비지도되는 것은 아니지만 감독되지 않는다는 점에서 특별한 유형의 신경망이기도 합니다. 입력을 사용하여 모델의 출력을 훈련하기 때문에 자체 감독됩니다.
이미지 작업 시 인코더는 가중 필터를 생성하여 이미지의 패턴을 추출하는 동시에 이미지를 점점 더 작은 모양으로 압축하는 일련의 2차원 컨벌루션 레이어입니다. 디코더는 인코더의 프로세스를 거울처럼 반영하여 적은 양의 데이터를 더 큰 데이터로 재구성하고 확장합니다. 모델은 원본과 재구성 사이의 평균 제곱 오차를 최소화합니다. 충분히 훈련되면 원본과 모델 출력 사이의 평균 제곱 오차는 매우 작습니다. 평균 제곱 오류는 최소화되지만 재구성된 이미지와 원본 이미지 사이에는 특히 가장 작은 세부 사항에서 여전히 시각적 차이가 있습니다. 오토인코더는 잡음 감소기입니다. 우리는 가능한 한 많은 세부 정보를 추출하고 싶지만 궁극적으로 오토인코더는 일부 세부 정보도 혼합합니다.
처음에는 위에 설명된 구조를 사용하여 네트워크를 훈련했지만 재구성에서 많은 세부 사항이 누락되었음을 발견했습니다. 컨벌루션 레이어는 전체 이미지의 작은 조각에 불과한 패턴을 검색합니다. 하지만 필터를 훈련하고 관찰한 후에는 추출되는 패턴을 직관하기 어렵습니다.
이와 같은 자동 인코더는 여러 가지 다른 문제에 사용될 수 있으며 컨벌루션 레이어를 사용하면 이미지 인식 및 생성을 위한 많은 응용 프로그램이 있습니다. 하지만 멜 스펙트로그램은 이미지일 뿐만 아니라 시간에 따른 소리 내용의 주파수 그래프이기 때문에 약간 다른 구조를 구현하면 재구성 시 손실을 최소화하는 동시에 2차원 컨벌루션에 의해 생성되는 불확실성도 최소화할 수 있다고 생각합니다. 레이어.
모델의 최종 결과에 사용된 모델에서는 인코더를 두 개의 별도 인코더로 분할했습니다. 각 인코더는 1차원 컨벌루션 레이어를 사용하여 이미지 공간을 압축합니다. 한 인코더는 X에 대해 훈련하고, 다른 인코더는 X 전치 또는 입력의 90도 회전 버전에 대해 훈련합니다. 이런 방식으로 하나의 인코더는 이미지의 시간 축에서 정보를 학습하고, 다른 인코더는 주파수 축에서 학습합니다.
입력이 각 인코더를 통과한 후 결과로 인코딩된 벡터는 하나의 벡터로 연결되어 이전에 설명한 대로 2차원 컨벌루션 디코더 에 입력됩니다. 출력은 이전과 마찬가지로 입력 간 손실을 최소화하도록 학습됩니다.
결국, 최종 모델의 손실은 기본 구조보다 훨씬 낮아서 20 에포크 후에 0.0037(훈련)과 0.0037(검증)의 평균 제곱 오차에 도달했으며, 훈련 세트에는 125,440개의 이미지가, 훈련 세트에는 2560개의 이미지가 있습니다. 검증 세트.
다른 노트북에서 모델을 훈련시켰기 때문에 여기서는 데모 목적으로만 모델을 구축할 것이며, 모델이 구축되면 훈련된 모델에서 가중치를 로드할 것입니다.
네트워크를 통해 추론을 실행하고 결과를 저장하기 위한 사용자 정의 클래스를 사용하면 우리가 가지고 있는 모든 멜 스펙트로그램에 대한 잠재 공간을 구성할 수 있습니다. 인코더를 통해서만 데이터를 실행하고 모델을 초기화한 크기(이 경우 256차원)의 벡터를 수신하여 이를 수행할 수 있습니다.
모델을 통해 데이터의 잠재 공간에 의해 생성된 추상 환경을 탐색하기 위해 차원 축소를 사용할 수 있습니다. T-SNE와 마찬가지로 UMAP는 다차원 공간을 2차원으로 줄여 플롯으로 시각화할 수 있습니다.
사용자 정의 LatentSpace 클래스는 각 벡터에 대한 코사인 유사성을 사용하여 권장 사항을 검색합니다.
나는 이 추천 시스템을 끝없이 검색해왔고, 모델이 다르지만 비슷한 음악 소리 사이에서 매우 흥미로운 연결을 찾아낼 수 있다는 사실에 만족합니다. 내 결론 중 일부는 다음과 같습니다.
이것이 의미하는 바는 모델이 각 노래의 사운드 내용을 기반으로 추천을 하지만 노래를 듣는 것은 아니라는 것입니다. 멜 스펙트로그램을 생성하고 수학적 비교를 수행합니다.
때때로 시스템은 연령을 기준으로 노래를 추천합니다. 노래가 오래 전에 녹음된 경우 모델은 녹음 자료나 장비의 특정 주파수를 선택하여 결과를 표시합니다.
또, 목소리나 특정 악기를 잘 포착하는 모델이기도 합니다. 그렇기 때문에 노래에 말이나 노래가 많이 포함되어 있는 경우에는 음성 트랙만 추천할 수도 있습니다. 또한, 노래에 왜곡이 많은 경우 빗소리나 새소리를 추천할 수도 있습니다.
초기 EDA에서 지적했듯이 일부 트랙 미리보기는 Spotify API에서 사용할 수 없습니다. 따라서 모델에 대한 기여도 누락되었으며 모델에 완벽하게 적합할 수 있는 경우 권장되지 않습니다. 예를 들어 제임스 브라운(James Brown), 비틀즈(Beatles), 프린스(Prince)의 노래는 없습니다. 더 많은 데이터가 필요합니다.
시스템은 추천을 제공하기 위해 278,000개 이상의 미리 보기를 사용하고 있지만 아직 충분하지 않습니다. 모든 트랙에 대한 UMAP 프로젝션을 보면 데이터에 연속성이 많지만 몇 가지 구멍이 있습니다. 이상적으로는 시스템이 훨씬 더 많은 데이터를 활용해 활용할 수 있습니다.
Spotify와 같은 추천 시스템/서비스를 추천하는 데 탁월한 이유는 다양한 유형의 추천 시스템과 이와 같은 기능을 결합하여 추천을 제공한다는 것입니다. 정기적으로 듣는 음악을 추적하는 것부터 협업 필터링을 사용하여 유사한 사용자 사용량을 기반으로 추천을 찾는 것까지 Spotify는 누군가가 무엇을 좋아하고 들을지에 대해 훨씬 더 균형 잡힌 예측을 할 수 있습니다. 나는 이 모델이 예측을 하는 데 흥미롭다고 생각하지만 더 나은 예측을 위해 유사한 장르, 출시 연도 및 유사한 사용자 데이터와 같은 더 많은 기능을 추가함으로써 향상될 수 있습니다.
전체적으로 예측과 추천을 하는 것 외에도 음악적 언어와 소리의 연속성과 스펙트럼을 설명하는 데 이 모델의 진정한 중요성이 있다고 생각합니다. 장르는 사람들이 아티스트나 사운드에 붙이는 라벨이지만 장르는 혼합되고 모든 사운드는 적어도 수학적으로는 이 연속적인 공간에 존재합니다.
또한 음악에는 장벽이 없습니다. 대부분의 경우 추천 시스템에서 노래를 쿼리할 때 결과는 다양한 시대와 장소에서 나옵니다. 노래의 메타데이터는 자동 인코더의 입력이 아니기 때문에 결과는 음향 유사성을 기반으로 하며 그 이상은 아닙니다.