0


计算复杂度

提示:计算复杂度的简单理解(第一次写博客)

计算复杂度

计算复杂度

我们以Vicinity Vision Transformer论文中的图为例。
在这里插入图片描述图注:标准自注意力(左)和线性化自注意力(右)的图示。

  1. N
  2. N
  3. N表示输入图像的
  4. p
  5. a
  6. t
  7. c
  8. h
  9. patch
  10. patch数,
  11. d
  12. d
  13. d是特征维度。使
  14. N
  15. d
  16. N\gg d
  17. Nd,线性化自注意力的计算复杂度相对于输入长度线性增长,而标准自注意力的计算复杂度是二次的。

从输入到输出可以这样计算:

  1. (
  2. N
  3. ×
  4. d
  5. )
  6. ×
  7. (
  8. d
  9. ×
  10. N
  11. )
  12. =
  13. N
  14. ×
  15. N
  16. ×
  17. (
  18. d
  19. ×
  20. N
  21. )
  22. ×
  23. (
  24. N
  25. ×
  26. N
  27. )
  28. =
  29. d
  30. ×
  31. N
  32. (N\times d)\times (d\times N)=N\times N\times (d\times N)\times (N\times N)=d\times N
  33. (N×d)×(d×N)=N×N×(d×N)×(N×N)=d×N
  34. (
  35. d
  36. ×
  37. N
  38. )
  39. ×
  40. (
  41. N
  42. ×
  43. d
  44. )
  45. =
  46. d
  47. ×
  48. d
  49. ×
  50. (
  51. d
  52. ×
  53. d
  54. )
  55. ×
  56. (
  57. d
  58. ×
  59. N
  60. )
  61. =
  62. d
  63. ×
  64. N
  65. (d\times N)\times (N\times d)=d\times d\times (d\times d)\times (d\times N)=d\times N
  66. (d×N)×(N×d)=d×d×(d×d)×(d×N)=d×N

关于计算复杂度:其实可以认为是乘法次数。我们给出最直观的解释。

假设有两个矩阵做乘法,如下:

  1. [
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. ]
  9. ×
  10. [
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
  17. ]
  18. =
  19. [
  20. 1
  21. 2
  22. 3
  23. 4
  24. 5
  25. 6
  26. 7
  27. 8
  28. 9
  29. ]
  30. \left[\begin{matrix}1&2\\3&4\\5&6\\\end{matrix}\right]\times\left[\begin{matrix}1&2&3\\4&5&6\\\end{matrix}\right]=\left[\begin{matrix}1&2&3\\4&5&6\\7&8&9\\\end{matrix}\right]
  31. ⎣⎡​135246​⎦⎤​×[142536​]=⎣⎡​147258369​⎦⎤​,其中行数为
  32. N
  33. N
  34. N,列数为
  35. d
  36. d
  37. d
  38. (
  39. 3
  40. ×
  41. 2
  42. )
  43. ×
  44. (
  45. 2
  46. ×
  47. 3
  48. )
  49. =
  50. (
  51. 3
  52. ×
  53. 3
  54. )
  55. ×
  56. (
  57. N
  58. ×
  59. d
  60. )
  61. ×
  62. (
  63. d
  64. ×
  65. N
  66. )
  67. =
  68. (
  69. N
  70. ×
  71. N
  72. )
  73. (3\times 2)\times (2\times 3)=(3\times 3)\times (N\times d)\times (d\times N)=(N\times N)
  74. (3×2)×(2×3)=(3×3)×(N×d)×(d×N)=(N×N)
  75. 3
  76. ×
  77. 3
  78. 3\times 3
  79. 3×3矩阵第一个元素涉及的乘法次数:
  80. 1
  81. ×
  82. 1
  83. +
  84. 2
  85. ×
  86. 4
  87. =
  88. 9
  89. 1\times 1+2\times 4=9
  90. 1×1+2×4=9 2次乘法;其它元素是一样的。最后可以得到
  91. 2
  92. ×
  93. 9
  94. =
  95. 2
  96. ×
  97. 3
  98. ×
  99. 3
  100. =
  101. d
  102. ×
  103. N
  104. ×
  105. N
  106. =
  107. N
  108. 2
  109. d
  110. 2\times 9=2\times 3\times 3=d\times N\times N=N^{2}d
  111. 2×9=2×3×3=d×N×N=N2d.

假设又有两个矩阵做乘法,如下:

  1. [
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. ]
  9. ×
  10. [
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
  17. ]
  18. =
  19. [
  20. 1
  21. 2
  22. 3
  23. 4
  24. ]
  25. \left[\begin{matrix}1&2&3\\4&5&6\\\end{matrix}\right]\times\left[\begin{matrix}1&2\\3&4\\5&6\\\end{matrix}\right]=\left[\begin{matrix}1&2\\3&4\\\end{matrix}\right]
  26. [142536​]×⎣⎡​135246​⎦⎤​=[1324​],其中行数为
  27. d
  28. d
  29. d,列数为
  30. N
  31. N
  32. N
  33. (
  34. 2
  35. ×
  36. 3
  37. )
  38. ×
  39. (
  40. 3
  41. ×
  42. 2
  43. )
  44. =
  45. (
  46. 2
  47. ×
  48. 2
  49. )
  50. ×
  51. (
  52. d
  53. ×
  54. N
  55. )
  56. ×
  57. (
  58. N
  59. ×
  60. d
  61. )
  62. =
  63. (
  64. d
  65. ×
  66. d
  67. )
  68. (2\times 3)\times (3\times 2)=(2\times 2)\times (d\times N)\times (N\times d)=(d\times d)
  69. (2×3)×(3×2)=(2×2)×(d×N)×(N×d)=(d×d)
  70. 2
  71. ×
  72. 2
  73. 2\times 2
  74. 2×2矩阵第一个元素涉及的乘法次数:
  75. 1
  76. ×
  77. 1
  78. +
  79. 2
  80. ×
  81. 3
  82. +
  83. 2
  84. ×
  85. 5
  86. =
  87. 17
  88. 1\times 1+2\times 3+2\times 5=17
  89. 1×1+2×3+2×5=17 3次乘法;其它元素是一样的。最后可以得到
  90. 3
  91. ×
  92. 4
  93. =
  94. 3
  95. ×
  96. 2
  97. ×
  98. 2
  99. =
  100. N
  101. ×
  102. d
  103. ×
  104. d
  105. =
  106. N
  107. d
  108. 2
  109. 3\times 4=3\times 2\times 2=N\times d\times d=Nd^2
  110. 3×4=3×2×2=N×d×d=Nd2 .

为什么会有这种情况呢?以第二个例子为例,可以观察到,所得结果的一个元素的乘法数量和消失的维度大小有关,也就是列数

  1. N
  2. N
  3. N,或者说,列数
  4. N
  5. N
  6. N就是所得结果一个元素的乘法次数。那么多少个元素呢?元素个数就要看你是如何进行的乘法操作,其实就是矩阵大小。比如
  7. (
  8. 2
  9. ×
  10. 3
  11. )
  12. ×
  13. (
  14. 3
  15. ×
  16. 2
  17. )
  18. =
  19. (
  20. 2
  21. ×
  22. 2
  23. )
  24. ×
  25. (
  26. d
  27. ×
  28. N
  29. )
  30. ×
  31. (
  32. N
  33. ×
  34. d
  35. )
  36. =
  37. (
  38. d
  39. ×
  40. d
  41. )
  42. (2\times 3)\times (3\times 2)=(2\times 2)\times (d\times N)\times (N\times d)=(d\times d)
  43. (2×3)×(3×2)=(2×2)×(d×N)×(N×d)=(d×d),那么就是
  44. d
  45. 2
  46. d^2
  47. d2个元素,最后乘法次数就是
  48. N
  49. d
  50. 2
  51. Nd^2
  52. Nd2

乘法次数=消失的维度 × 所得矩阵大小

那么计算复杂度呢?我们不要去管

  1. O
  2. (
  3. )
  4. O(\bullet)
  5. O(∙)具体代表什么,这不重要。

以第一个图为例,乘法次数1:

  1. (
  2. N
  3. ×
  4. d
  5. )
  6. ×
  7. (
  8. d
  9. ×
  10. N
  11. )
  12. =
  13. N
  14. 2
  15. d
  16. (N\times d)\times (d\times N)=N^{2}d
  17. (N×d)×(d×N)=N2d;乘法次数
  18. 2
  19. 2
  20. 2
  21. (
  22. N
  23. ×
  24. d
  25. )
  26. ×
  27. (
  28. d
  29. ×
  30. N
  31. )
  32. =
  33. N
  34. 2
  35. d
  36. (N\times d)\times (d\times N)=N^{2}d
  37. (N×d)×(d×N)=N2d
  38. O
  39. (
  40. N
  41. 2
  42. d
  43. +
  44. N
  45. 2
  46. d
  47. )
  48. =
  49. O
  50. (
  51. N
  52. 2
  53. )
  54. O(N^{2}d+N^{2}d)=O(N^2)
  55. O(N2d+N2d)=O(N2)。因为
  56. N
  57. d
  58. N\gg d
  59. Nd,所以
  60. d
  61. d
  62. d(还有常数
  63. 2
  64. 2
  65. 2)被省略了,即
  66. O
  67. (
  68. N
  69. 2
  70. )
  71. O(N^2)
  72. O(N2)。

以第二个图为例,乘法次数1:

  1. (
  2. d
  3. ×
  4. N
  5. )
  6. ×
  7. (
  8. N
  9. ×
  10. d
  11. )
  12. =
  13. N
  14. d
  15. 2
  16. (d\times N)\times (N\times d)=Nd^2
  17. (d×N)×(N×d)=Nd2;乘法次数2
  18. (
  19. d
  20. ×
  21. d
  22. )
  23. ×
  24. (
  25. d
  26. ×
  27. N
  28. )
  29. =
  30. N
  31. d
  32. 2
  33. (d\times d)\times (d\times N)=Nd^2
  34. (d×d)×(d×N)=Nd2
  35. O
  36. (
  37. N
  38. d
  39. 2
  40. +
  41. N
  42. d
  43. 2
  44. )
  45. =
  46. O
  47. (
  48. N
  49. )
  50. O(Nd^2+Nd^2)=O(N)
  51. O(Nd2+Nd2)=O(N)。因为
  52. N
  53. d
  54. N\gg d
  55. Nd,所以
  56. d
  57. d
  58. d(还有常数2)被省略了,即
  59. O
  60. (
  61. N
  62. )
  63. O(N)
  64. O(N)。

事实告诉我们,我们两个的结果一样,但是我们可以通过控制中间过程减少计算复杂度。


本文转载自: https://blog.csdn.net/qq_42584216/article/details/125533848
版权归原作者 qq_42584216 所有, 如有侵权,请联系我们删除。

“计算复杂度”的评论:

还没有评论