이중 확산
이중 확산은 음악을위한 생성 확산 모델입니다. 이 리포지토리 의이 모델과 코드는 여전히 진행중인 작업입니다.
현재 개발 중에 SNES 게임의 음악을 내 데이터 세트로 사용하고 있습니다. 데이터 세트는 1 분에서 3 분 사이의 ~ 20,000 샘플로 구성됩니다. 게임을 사용하고 있습니다. 음악은 컨디셔닝을위한 클래스 레이블로 음악을 사용하고 있습니다. 즉, 적절한 악기와 스타일로 새로운 음악을 생성하기 위해 게임 (또는 여러 게임의 가중 조합)을 선택할 수 있습니다. 클래스 / 게임당 예의 수는 ~ 5 ~ ~ 50이며, 1 개 이상의 게임을 결합한 모든 생성 된 샘플은 "Zero-Shot"입니다.
여러 단계의 교육 / 개발 단계에서 모델에서 생성 된 일부 샘플을들을 수 있습니다.
나는 2023 년 8 월/2023 년에 3 가지 목표를 달성하려는 의도 로이 프로젝트를 시작했습니다.
- 추론과 훈련 모두에서 현대 확산 모델의 모든 구성 요소에 익숙해 지십시오.
- 실제로 듣고 싶은 음악을 생성 할 수있는 모델을 처음부터 훈련
- 단일 소비자 GPU (4090) 만 사용하여 위의 작업을 수행하십시오.
이 모델은 지난 12 개월 동안 개발 과정에서 실질적으로 변경되었습니다.
처음 (2023 년 8 월/2023 년) 확산 모델은 무조건적이며 원시 오디오에서 직접 작업했습니다.
- 메모리 및 성능 제약으로 인해 이것은 8kHz에서 ~ 16 초의 모노 오디오로 제한되었음을 의미했습니다.
- 다양한 전처리 단계로 1D 및 2D 형식을 실험했습니다. 2D 형식은 작은 데이터 세트로 더 나은 일반화 할 수 있으며 1D 형식보다 더 많은 컴퓨팅 및 매개 변수를 사용했습니다.
- 2D 형식의 경우 분리 가능한주의를 사용하여 (배치 치수와 교대로 행 / 열을 병합) 너무 많은 품질을 희생하지 않고 실용적인 높은 차원 모델에서주의를 사용할 수 있습니다.
- 형식이 선형 주파수 척도, 특히 주파수 축에 대한 위치 임베딩과 함께 모델이 음악의 지각 ~ 로그 주파수 척도를 이해할 수 있도록주의를 기울여야한다는 점을 발견했습니다.
- 코사인 기반 일정을 가진 V- 예측은 어떤 대안 (원시 오디오 / 비 배정 확산의 경우)보다 훨씬 더 잘 작동한다는 것을 알았습니다.
2023 년 12 월/2023 년에 나는 잠재적 인 확산 모델을 시도하기 위해 변형 자동 인코더 모델을 훈련하기 시작했다.
- 잠재적 인 확산으로 이동 한 후 32kHz 스테레오 @ 45 초의 작물에 대한 확산 모델 훈련을 시작할 수있었습니다.
- 나는 재구성 품질 측면에서 점별 손실이 매우 저조한 것으로 나타 났으며, 다중 규모의 스펙트럼 손실이 훨씬 더 나은 옵션이라는 것을 알았습니다. 나는 단계에 적절하게 가중치 손실 항을 추가하면 멀티 스케일 스펙트럼 전력 밀도 손실이 음악 및 학습 피치에 상당히 더 잘 작동한다는 것을 알았습니다.
- 나는 위상을 포함하는 VAE가 양호한 재구성 품질과 컴팩트 한 잠복 공간을 갖는 것이 가능했지만, 잠재 된 공간은 엔트로피가 높았으며 잠복 확산 모델에 의해 쉽게 해석 할 수 없었습니다. 이로 인해 좋은 품질의 사운드를 생성 할 수 있지만 음악성이 좋지 않은 모델이 생겼습니다.
- 나는 잠복 확산 모델이 균일 한 분산을 갖는 입력 잠복으로 실질적으로 더 잘 수행된다는 것을 발견했다. 로그 분산이 학습 가능한 매개 변수가 될 필요는 없으며 대신 잠재 분포를위한 균일 한 대상 SNR을 사전 정의합니다.
- 잠재 분배 모드가 훈련 목표에 사용되는 경우 잠복 분포에서 더 낮은 대상 SNR / 더 높은 로그 분산으로 잠복 확산 모델 성능이 실질적으로 개선된다는 것을 발견했습니다. 더 낮은 대상 SNR을 사용하면 잠복 확산 모델이 훈련 및 추론 모두에서 저음 수준을 배제 할 수 있습니다. 샘플링 후 잔류 노이즈는 잠재 분포의 예상 분산과 일치하도록 설계 될 수 있습니다.
2024 년 3 월에 나는 위상 정보를 제외하고 Mel 스케일 스펙트로 그램 기반 형식을 사용하기 시작했습니다.
- 창과 스펙트로 그램 매개 변수를 조정하고 스테레오 신호에 대한 스테레오 신호에 대한 어닐링으로 알고리즘을 수정하여 FGLA 위상 재구성을 상당히 개선 할 수 있음을 발견했습니다. 나는 너무 많은 지각 품질을 희생하지 않고 비판적으로 샘플링 된 원시 오디오와 동일한 스펙트럼 차원을 초래 한 매개 변수 세트에 정착했습니다.
- 다중 규모 스펙트럼 손실이 스펙트로 그램 / 이미지 데이터에 대해 잘 작동한다는 것을 알았으며, 그 결과 품질은 점별 손실과 적대적 손실 사이에 있습니다.
2024 년 4 월/2024 년에 나는 확산 모델과 VAE UNET (이전에 디퓨저의 무조건 UNET 기반)을 개선 된 EDM2 UNET로 대체했습니다.
- EDM2 UNET를 몇 차례 개선했습니다.
- 토치 SDP주의로자인 주목을 대체했습니다
- 더 부드러운 내부 제품 공간에 대한 푸리에 임베딩 주파수 / 위상 교체
- 기대에 크기를 보존하는 방식으로 클래스 레이블 드롭 아웃 추가
- MPCONV 모듈의 순방향 방법에서 중량 정규화를 중량 정규화로 교체하여 가중치가 개선 된 성능 및 메모리 소비가 낮아질 때만 적용되는 중량 정규화
- 추론 중에 기대치 크기를 보존하기 위해 블록 내부의 드롭 아웃을 사용할 때 보정 추가
- 성능 향상을 위해 상향/다운 샘플을 동등한 토치 내장으로 교체했습니다.
- 사전 컨디셔닝 코드 중 일부를 UNET 자체로 병합했습니다.
- Torch Dynamo / Model Compilation을 사용하기 시작했고 최대 성능을 위해 적절한 컴파일러 힌트를 추가했습니다.
- 품질과 제어의 주요 개선을 위해 클래스 레이블 기반 컨디셔닝을 사용하고 분류기 무료 지침을 구현했습니다.
2024 년 5 월에 EDM/DDIM 소음 일정, 샘플링 알고리즘 및 학습 속도 일정을 채택했습니다.
- 나는 시그마 당 추정 오차 분산을 사용하여 모델이 가장 진행할 수있는 소음 수준에 명시 적으로 초점을 맞추는 시그마 샘플링 PDF를 계산하여 훈련에서 로그-정규 시그마 샘플링이 개선 될 수 있음을 발견했습니다.
- 나는 계층화 된 샘플링을 사용하여 각 미니 배치 내에서 가능한 한 균등하게 시그마를 분배하면 더 작은 미니 배치로 문제를 완화 할 수 있음을 발견했습니다.
- 확산 모델 훈련 전에 성능 향상 및 메모리 소비 감소 전에 데이터 세트의 잠복을 사전 인코딩하기 시작했습니다. 임의의 작물이 하위 라트 픽셀 오프셋에 의해 생성 된 변화가 없기 때문에 임의의 작물이 생성 된 샘플 품질에 부정적인 영향을 줄 수 있기 전에 잠복을 사전 인코딩하는 것을 발견했습니다. 나는 그 오프셋에 대해 사전 인코딩 된 잠재적 변형을 추가했습니다.
- 나는 여러 길이의 EMA 무게로 훈련을 시작했습니다.
2024 년 6 월 -7 월/2024 년에 나는 모델 아키텍처를 실험하고 샘플링에 노이즈를 추가했습니다.
- 모델 RESNET 블록에서 저 순위 선형 레이어를 사용하면 매개 변수 수를 크게 증가시키지 않으면 서 품질을 크게 증가시킬 수 있습니다. 구체적으로, 비선형 성이 적용되는 RESNET 블록 내부에 더 많은 수의 치수로 투사 한 다음 다시 아래로 투사합니다.
- 자체 소송 QKV 선형 층에 조절 된 변조를 추가하면 컨디셔닝 품질이 크게 증가했습니다.
- 나는 모든 새로운 아키텍처 개선을 사용하여 또 다른 1D 모델을 훈련 시켰으며 1D 모델이 작은 데이터 세트로 제대로하지 못한다는 초기 연구 결과를 확인했습니다.
- 이 논문에서 영감을 얻은 나는 샘플링 중에 모델이 중요하거나 가까운 상태 인 단계의 수를 연장하기 위해 많은 양의 노이즈를 추가하면서 실험했다. 이것은 샘플의 품질을 크게 증가시키는 동시에 음악에 바람직한 결과 샘플 온도를 크게 낮 춥니 다.
2024 년 8 월/2024 년에 나는 코드베이스의 거의 완료된 재 작성을 시작하여 빠른 실험의 마지막 해에 축적 된 기술 부채를 갚기 시작했다.
- 디퓨저를 사용한 나머지 코드의 마지막 코드를 다시 구현하고 종속성을 제거했습니다.
- 임의 모듈에 대한 교육 프로세스를 쉽게 실험 할 수 있도록 모듈 식 시스템을 구축했습니다.
- 교육 코드는 재 작성되었으며 자동화 된 하이퍼 파라미터 또는 모델 아키텍처 검색을 허용하기 위해 가능한 한 많은 구성 파일을 사용합니다.
- 데이터 세트 사전 처리 코드가 완전히 다시 작성되었습니다. 나는 더 많은 양의 저품질 데이터를 사용할 수있는 데이터 세트를 필터링하고 증강하기 위해 도구 / 모델을 개발하는 데 더 많은 시간을 할애하려고합니다.
2024 년 9 월/2024 년에 나는 인화 된 모델을 훈련하기 시작했고 Webui를 만들기 시작했습니다.
- 안정적인 확산에 의해 사용되는 인 페인팅 모델 변환 / 강화 전략 (제 1 Conv_in 레이어의 참조 샘플 및 마스크)은 모델과 함께 작동하지만 올바르게 수렴하는 데 시간이 걸릴 수 있음을 발견했습니다. 기존 모델에 인파를 추가하면 비상장 성능이 약간 줄어들어 지금은 인 페인팅 모델을 사용하고 있습니다. 두 작업 모두에 하나의 모델 만 필요한 시점까지 성능을 향상시키는 방법을 찾고 싶습니다.
- Webui의 경우 나는 Gradio로 시작했지만 불행한 한계와 성능 저하를 발견했습니다. 대안을 찾고 나는 Nicegui가 내가 달성하고자하는 것에 훨씬 더 잘 맞는 것으로 나타났습니다. 현재 WebUI는 기능적이지만 WebUI 제어 모델 스위칭과 개발에 사용했던 세부 디버그 정보 / 플롯이 누락되었습니다. 기본 HTML5 오디오 요소는 클라크가 많으며 오디오 편집에 더 적합한 사용자 정의 플레이어로 교체하기 위해 노력할 것입니다.
2024 년 10 월에 나는 Webui를 계속 개발하고 EMA 기술을 실험하고 있습니다.
- 기본 HTML5 오디오 요소를 스펙트로 그램 뷰를 보여주고 정확한 시간 커서를 포함하는 사용자 정의 니스 게이 요소로 교체했습니다. 이로 인해 in-painting 도구의 사용 편의성과 정밀도가 향상되었습니다.
- 생성 된 샘플을 확장 또는 선불로 autainting을 추가했습니다. 또한 원활한 루프를 생성하는 옵션도 추가했습니다.
- Pytorch 모델 처리를 자체 프로세스로 분리하여 UI를보다 반응을 보였습니다.
- Switchema는 추가 비용 / 교육 오버 헤드없이 검증 손실을 크게 개선 할 수 있음을 발견했습니다.
- 일부 실험 후에 나는 피드백 강도를 제어하기 위해 하이퍼 파라미터를 사용하여 EMA 중량의 피드백을 기차 중량으로 다시 사용 하여이 기술을 더욱 향상시킬 수 있음을 발견했습니다.
2024 년 11 월에 클래스 레이블 컨디셔닝 시스템을 클리너 확장 데이터 세트로 모델을 훈련시키는 목표로 클래스 레이블 컨디셔닝 시스템을 대체하기 위해 Clap을 채택하는 프로세스를 시작했습니다.
- 트랜스 코딩 및 라벨링에 foobar2000을 사용하여 일부 데이터 세트 준비 워크 플로를 교체했습니다.
- 나는 데이터 세트의 샘플에 대해 기존 사전 인코딩 된 잠복에 미리 인코딩 된 박수 내장을 추가했습니다. 사전 정의 된 라벨 / 캡션 목록 및 부정적인 예제에 대한 이러한 임베딩의 점수는 오디오 메타 데이터를 업데이트하고 데이터 세트를 청소 / 필터링하는 프로세스를 부트 스트랩하는 데 사용됩니다.
- 박수 컨디셔닝을 모델 교육에 통합하는 다양한 방법으로 실험을 시작했습니다. 전체 데이터 세트에 총 평균 오디오 임베딩을 사용하면 컨디셔닝 드롭 아웃 및 분류기가없는 안내를 사용할 때 무조건 임베딩으로 효과적으로 사용할 수 있습니다. 간단한 클래스 레이블이되는 방법에 대한 집계 오디오 및 텍스트 임베드는 해당 클래스에서 샘플링하는 데 효과적으로 사용될 수 있음을 알았습니다.
몇 가지 추가 메모 :
- 교육 코드는 Huggingf
- 데이터 세트 사전/사후 처리 코드는이 저장소에 포함되어 있으며 자체 데이터에서 새 모델을 훈련시키는 데 필요한 모든 것을 포함합니다.
- 이 저장소의 모든 코드는 Windows 및 Linux 플랫폼에서 작동하도록 테스트되었지만 Linux에서 성능이 훨씬 향상됩니다.